web-dev-qa-db-ja.com

正しいパスワードの入力に依存してコマンドを実行させるにはどうすればよいですか(Tkinter GUI)?

Tkinter/pythonに小さなGUIを作成しました:

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に間違ったパスワードが指定された場合、ダイアログには「Login successful!」と表示されます。

「ログインに成功しました!」ではなく、パスワードの入力が間違っていたことを表示するにはどうすればよいですか。このウィンドウを、作成中のアプリケーションのログイン画面として作成します。

1
Ashwin Joshi

トピック外ですが、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()
_

ただし、GUIを実行しているため、_gksudo su_は効果がありません。

説明

subprocess.check_call(["gksudo", "su"])

...パスワードが間違っている場合に_subprocess.CalledProcessError_を発生させ、メッセージを表示します:

enter image description here

パスワードが正しい場合、メッセージ:

enter image description here

表示されます。

注意

_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!")
_
3
Jacob Vlijm