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!")