Como posso fazer executar um comando depende da entrada de uma senha correta (Tkinter GUI)?

1

Eu criei uma pequena GUI em Tkinter/python :

import Tkinter
import tkMessageBox
import os
top = Tkinter.Tk()
top.geometry("400x250")

def root_login():
    os.system("gksudo su && sudo su")   
    tkMessageBox.showinfo("Login successful!")

def close_window():
    top.destroy()


B = Tkinter.Button(top, text ="Login", command = root_login)
B.pack()

Q = Tkinter.Button(top, text ="Quit", command = close_window)
Q.pack()

top.mainloop()

Se uma senha incorreta é dada no gksudo su dialog , o diálogo ainda mostra "Login successful!".

Como mostro que a entrada da senha estava errada, em vez de "Login successful!". Eu quero criar essa janela como uma tela de login para o aplicativo que estou construindo.

    
por Ashwin Joshi 06.01.2016 / 10:20

1 resposta

3

No limite de estar fora do tópico, mas por causa de gksudo :

Não tem certeza do que você deseja alcançar, pois a GUI não tem nenhum efeito sobre o que acontece no terminal:)

Então, tecnicamente

O problema é que você não define uma condição para que o tkMessageBox.showinfo("Login successful!") seja executado, então o que acontecer em os.system("gksudo su && sudo su") , a próxima linha será executada.

def root_login():
    os.system("gksudo su && sudo su")   
    tkMessageBox.showinfo("Login successful!")

Como fazer isso funcionar

Primeiro, você não deve mais usar os.system : Realmente, muito antiquado.

Veja abaixo uma codificação alternativa, usando subprocess.check_call :

#!/usr/bin/env python
import subprocess
import Tkinter
import tkMessageBox

top = Tkinter.Tk()
top.geometry("400x250")

def root_login():
    try:
        subprocess.check_call(["gksudo", "su"])
    except subprocess.CalledProcessError:
        tkMessageBox.showinfo("message", "OOOOPS...\nWrong password!")
    else:
        tkMessageBox.showinfo("message", "Login successful!")

def close_window():
    top.destroy()

B = Tkinter.Button(top, text ="Login", command = root_login)
B.pack()
Q = Tkinter.Button(top, text ="Quit", command = close_window)
Q.pack()

top.mainloop()

Mas, novamente, gksudo su não tem nenhum efeito, já que você executa uma GUI:)

Explicação

subprocess.check_call(["gksudo", "su"])

... aumentará um subprocess.CalledProcessError caso a senha esteja incorreta e mostre a mensagem:

Se a senha estiver correta, a mensagem:

aparecerá.

Nota

A construção try/except/else , eu fiz por motivos de clareza. A função abaixo faz exatamente o mesmo, já que a função "pulará" da linha:

subprocess.check_call(["gksudo", "su"])

para

tkMessageBox.showinfo("message", "OOOOPS...\nWrong password!")

no caso, e imediatamente se, o primeiro aumenta o subprocess.CalledProcessError :

def root_login():
    try:
        subprocess.check_call(["gksudo", "su"])
        tkMessageBox.showinfo("message", "Login successful!")
    except subprocess.CalledProcessError:
        tkMessageBox.showinfo("message", "OOOOPS...\nWrong password!")
    
por Jacob Vlijm 06.01.2016 / 11:13