Как сделать выполнение команды зависимым от ввода правильного пароля (графический интерфейс 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!")
Другие вопросы по тегам