How хан I make running в command depend on the неудар в лунку of в correct password (Tkinter GUI)?

I created в small GUI in 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()

If an incorrect password is given in the gksudo su dialog, the составьте в форме диалога still шоу "Login successful!".

How do I шоу that the password неудар в лунку was wrong, instead of "Login successful!". I want to верьте тебе this window в туз в login screen for the application гm building.

1
задан 6 January 2016 в 15:01

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"])

... повысит a subprocess.CalledProcessError в случае, если пароль является неправильным, и покажите сообщение:

enter image description here

Если пароль является правильным, сообщение:

enter image description here

появится.

Примечание:

try/except/else конструкция, я сделал по причинам ясности. Функция ниже делает точно то же, так как функция wil "переходит" от строки:

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!")
3
ответ дан 7 December 2019 в 12:42

Другие вопросы по тегам:

Похожие вопросы: