J'ai créé une petite interface graphique dans 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()
Si un mot de passe incorrect est donné dans le gksudo su dialog
, la boîte de dialogue indique toujours "Connexion réussie!".
Comment puis-je montrer que la saisie du mot de passe était incorrecte, au lieu de "Connexion réussie!". Je souhaite créer cette fenêtre en tant qu'écran de connexion pour l'application que je construis.
À la limite d'être hors sujet, mais dans l'intérêt de gksudo
:
Vous ne savez pas exactement ce que vous voulez réaliser, car l'interface graphique n'a aucun effet sur ce qui se passe dans le terminal :)
Le problème est que vous ne définissez pas de condition pour l'exécution de tkMessageBox.showinfo("Login successful!")
. Ainsi, quoi qu'il se passe dans os.system("gksudo su && Sudo su")
, la ligne suivante sera exécutée.
def root_login():
os.system("gksudo su && Sudo su")
tkMessageBox.showinfo("Login successful!")
Tout d’abord, vous ne devriez plus utiliser os.system
: vraiment, vraiment à l’ancienne.
Voir ci-dessous pour un codage alternatif, en utilisant 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()
Mais encore une fois, gksudo su
n'a aucun effet, puisque vous exécutez une interface graphique :)
subprocess.check_call(["gksudo", "su"])
... lève un subprocess.CalledProcessError
si le mot de passe est incorrect et affiche le message:
Si le mot de passe est correct, le message:
apparaîtra.
La construction try/except/else
, je l’ai fait pour des raisons de clarté. La fonction ci-dessous fait exactement la même chose, puisque la fonction "saute" depuis la ligne:
subprocess.check_call(["gksudo", "su"])
à
tkMessageBox.showinfo("message", "OOOOPS...\nWrong password!")
au cas et immédiatement si, le premier soulève le 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!")