Как сделать выполнение команды зависимым от ввода правильного пароля (графический интерфейс Tkinter)?
Я создал небольшой графический интерфейс в 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
:
Не уверен, что вы хотите достичь, так как графический интерфейс не влияет на то, что происходит в терминале:)
Тогда технически
Проблема в том, что вы не устанавливаете условие для 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
не имеет никакого эффекта, так как вы запускаете графический интерфейс:)
объяснение
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!")