如何使命令的运行依赖于正确密码的输入(Tkinter GUI)?

如何使命令的运行依赖于正确密码的输入(Tkinter GUI)?

我创建了一个小型 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!")

相关内容