我创建了一个小型 GUI 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()
如果在中输入了错误的密码gksudo su dialog
,对话框仍显示“登录成功!”。
如何显示密码输入错误,而不是“登录成功!”?我想将此窗口创建为正在构建的应用程序的登录屏幕。
答案1
有点偏离主题,但为了gksudo
:
不确定你想要实现什么,因为 GUI 对终端上发生的事情没有任何影响:)
那么从技术上来说
问题在于您没有设置要tkMessageBox.showinfo("Login successful!")
执行的条件,因此无论发生什么os.system("gksudo su && sudo su")
,下一行都会执行。
def root_login():
os.system("gksudo su && sudo su")
tkMessageBox.showinfo("Login successful!")
如何实现
首先,你不应该os.system
再使用任何:真的,真的很老式。
请参阅下面的替代编码,使用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()
但同样,gksudo su
由于您运行的是 GUI,因此没有任何效果:)
解释
subprocess.check_call(["gksudo", "su"])
...如果密码不正确将会引发subprocess.CalledProcessError
,并显示消息:
如果密码正确,则显示以下信息:
会出现。
笔记
我这样做是为了清晰起见try/except/else
。下面的函数做同样的事,因为函数会从以下行“跳转”:
subprocess.check_call(["gksudo", "su"])
到
tkMessageBox.showinfo("message", "OOOOPS...\nWrong password!")
如果发生以下情况,并且立即发生,则第一个引发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!")