0

モーダル ダイアログ ボックスを表示するメニューが必要です。アクセラレータを追加するまでは、すべて問題ありません。これを行い、アクセラレータを使用してダイアログにアクセスすると、ハングします。「バインド」から呼び出されたときに、モーダル ダイアログ ボックス内で使用される wait_window が何らかの形でメインループと競合していると思われます。次に例を示します。

import tkinter
from tkinter import simpledialog

class App(tkinter.Tk):
    def __init__(self):
        tkinter.Tk.__init__(self)
        self.bind_all("<Control-f>", lambda event: self.menu_file())
        menubar = tkinter.Menu(self)
        fileMenu = tkinter.Menu(menubar, tearoff=False)
        fileMenu.add_command(label="File", underline=0, 
                             command=self.menu_file, accelerator="Control+f")
#        fileMenu.add_command(label="File", underline=0, 
#                             command=self.menu_file)
        menubar.add_cascade(label="File",underline=0, menu=fileMenu)
        self.config(menu=menubar)

    def menu_file(self):
        simpledialog.Dialog(self,"Message")

app=App()
app.mainloop()

上記のコードで、アクセラレータを追加する行をコメント アウトし、次の行のコメントを解除すると、ハングアップは発生しません (もちろん、Ctrl+F を使用してダイアログ ボックスにアクセスできます)。唯一の問題は、[ファイル] メニューの横にアクセラレータの文字列が表示されないことです。私が見つけた Web 上の tkinter のドキュメントによると、アクセラレータを追加しても、メニューの表示方法だけが変更され、他には何も変更されないはずなので、本当に困惑しています。誰でもアイデアはありますか?(もちろん、表示される文字列を変更してアクセラレータをエミュレートすることもできますが、これは洗練されたソリューションとは考えていません。)

4

1 に答える 1

0

お気づきのとおり、これは Mac 固有のバグです。Mac の既知の Tk バグ (リンクを参照) に対して提案された回避策に従い、メニュー メソッドをキーストロークにバインドする行を次のように変更します。

self.bind_all("<Command-f>", lambda event: self.after(100,self.menu_file))

バグを「修正」しています。また、遅いシステムでは 100 から 150 に増やすことも提案しています。うーん..

于 2013-09-04T02:27:33.507 に答える