2017-07-26 15 views
0

私はこれがダブル投稿ではないことを願っていますが、私の質問に対する答えは特にGoogleとフォーラム全体では見られませんでした。OverrideredirectとFullscreenのTkinter Entryウィジェット

基本的に何らかの理由で、エントリウィジェットを作成するとき。 self.attributes( ' - fullscreen'、True)とself.overrideredirect(True)が有効になっているときにGUIをフルスクリーンに設定すると、キーボードからのユーザー入力を許可しません。私はここに、このリンクを介して行ってきました(tkinter: can't enter into entry widget)とそれらの問題は似ていますが、まったく同じではないことがわかっ

(私はそう標準的なユーザーインターフェイスを出ることができないキオスクモードスタイルのGUIのためのつもりです)。私はMacでこれにいくつかの問題があることを理解していますが、この作業を実行するには別の方法が必要です。この問題は、Raspbianを実行しているRaspberry Piでこれを実行したときにも発生しました。フルスクリーンがアクティブではないが、オーバーライドのリダイレクトがアクティブな場合、それは機能します。オーバーライドリダイレクトがアクティブではないにもかかわらずフルスクリーンがアクティブな場合、それも機能します。

私はfocus_force()とfocus_set()を使ってフォーカスを設定しようとしましたが、フレームは休止していますが、動作しませんでした。

私のrelaventコードは以下のとおりです。私のコードの多くが必要な場合は、私に知らせてください。このコードの目的は、私のプログラムの残りの部分で呼び出されるユーザー名/パスワードのログイン方法です。

Mac OS Sierra 10.12.5でPyCharm Community Edition 2017.2を実行しています。前もって感謝します!

CODE

def admin(self, root_1): 
     master = tk.Tk() 
     text = "" 

     master.title("Administrator Login") 
     w_0, h_0 = master.winfo_screenwidth(), master.winfo_screenheight() 
     master.geometry("%dx%d+0+0" % (w_0, h_0)) 

     f1 = tk.Frame(master, width=w_0, height=h_0, background="red") 
     f2 = tk.Frame(master, width=w_0, height=h_0, background="blue") 

     f1.pack(fill="both", expand=True) 
     f2.place(in_=f1, anchor="c", relx=.5, rely=.5) 

     master.wm_attributes('-topmost', 'True') 
     master.overrideredirect(True) 

     instruction_label = tk.Label(f2, text="Please type your username and password", fg="red", bg="blue", 
            font=("Helvetica", 26)) 
     instruction_label.grid(row=0, columnspan=2, padx=20, pady=20) 
     user_label = tk.Label(f2, text="Username", font=("Helvetica", 16), bg="red") 
     user_entry = tk.Entry(f2, bg="red") 
     pass_label = tk.Label(f2, text="Password", font=("Helvetica", 16), bg="red") 
     pass_entry = tk.Entry(f2, bg="red", show="*") 

     user_label.grid(row=1, column=0, sticky=("E", "W"), padx=20, pady=10) 
     user_entry.grid(row=1, column=1, sticky="W", padx=20, pady=10) 
     pass_label.grid(row=2, column=0, sticky=("E", "W"), padx=20, pady=10) 
     pass_entry.grid(row=2, column=1, sticky="W", padx=20, pady=10) 

     user_entry.focus_force() 

     submit_button = tk.Button(f2, text="Submit", command=lambda: correct_login(text), bg="red", width = 20, height = 4) 
     submit_button.grid(row=3, column=0, sticky=("N", "S", "E"), padx=20, pady=20) 
     quit_button = tk.Button(f2, text="Quit", command=destroy, bg="red", width = 20, height = 4) 
     quit_button.grid(row=3, column=1, sticky=("N", "S", "W"), padx=20, pady=20) 

     user_entry.delete(0) 
     user_entry.insert(0, "") 

     pass_entry.delete(0) 
     pass_entry.insert(0, "") 

     return 

答えて

1

私は(それはあなたの問題を解決することはできませんが、それは自由なアドバイスです)に固定されなければならない、あなたのコード内の赤い旗を参照してください。あなたはrootを管理メソッドに渡しています。そして、Tk()をもう一度と呼んで、あなたが作業しているトップレベルを作成しています。これは良い習慣ではありません。 Toplevelコマンドを使用してください。以下の私のサンプルコードを見てください。

あなたが見た投稿は、overrideredirectに関するMACの一貫性があります(そして、明らかに正しい)。トップレベルウィンドウのこの属性は、ウィンドウマネージャーに、未処理ウィンドウのいくつかのイベントを無視するように指示します。どうやら、MACはキー押下イベントとリリースイベントを親でないトップレベルウィンドウ内のウィジェットに送信しません。

これを回避する方法の1つは、ウィンドウを親にする(通常)ことができますが、ウィンドウのクロージャを傍受する関数またはメソッドに "WM_DELETE_WINDOW"プロトコルを設定することです。私はあなたの管理方法の一番上の部分だけを掲示しています。

def admin(self, root_1): 
    master = Toplevel() 
    text = "" 

    master.title("Administrator Login") 
    w_0, h_0 = master.winfo_screenwidth(), master.winfo_screenheight() 
    master.geometry("%dx%d+0+0" % (w_0, h_0)) 
    master.protocol("WM_DELETE_WINDOW", self.dontDeleteWindow) 


def dontDeleteWindow(self): 
    print("User tied to close window") 
+0

ロン、私は入力とアドバイスを感謝します。私の管理メソッドのルートを渡す目的はroot.withdraw()を使って、バックグラウンドで親ウィンドウを表示させないようにすることです。フレームの後ろにある親ウィンドウの部分を見ることができるからです。次に、f2の "quit"ボタンを押すと親ウィンドウを戻すためにroot.deiconify()を使います。 (私はそれをより短く保つためのコードを投稿しなかった)。それが言われて、私はあなたが上に示したものに精通していません。 master.protocolは何をしているのですか?私はpythonに新しいので、私は謝罪します。 –

+0

あなたが試してみると、あなたが表示されます。 tkプロトコルは、タイトルバーのウィンドウの閉じるボタンを押すと、ワープロやスプレッドシートプログラムと同じように、保存されていないデータをアプリケーションに保存させる手段です。このようにして、アプリケーションはウィンドウを閉じるだけでなく、ウィンドウを閉じる前またはウィンドウを閉じる代わりにプログラマーが何らかの作業を行うことができます。私が掲示した例では、単にメッセージを出力しますが、master.destroy()またはsys.exit()で明示的に指示しない限り、ウィンドウは破棄されません。 –

関連する問題