1

Python のデフォルト エディタである IDLE では、複数の [開く] ダイアログを同時に開くことができます。

ソースを調べていますが、この動作を再現できる場所が見つかりません。彼らIOBinding.pyの から:

from tkinter import filedialog as TkFileDialog
...

class IOBinding:
    ...
    def askopenfile(self):
        dir, base = self.defaultfilename("open")
        if not self.opendialog:
            self.opendialog = tkFileDialog.Open(master=self.text,
                                                filetypes=self.filetypes)
        filename = self.opendialog.show(initialdir=dir, initialfile=base)
        return filename

そのため、tkinter の組み込みの filedialog モジュールを使用していますが、「モードレス」ダイアログを表示する方法が見つかりません。基本的に同じである 2 つのコードでダイアログを開くことができます。

from tkinter import filedialog as tkFileDialog

file_name = tkFileDialog.Open( ... ).show()
file_name = tkFileDialog.askopenfilename()

ただし、アプリケーション全体をブロックします。ユーザーは、ダイアログを閉じるまで、ウィンドウを切り替えたり、新しいコマンドを発行したりできません。また、これらのダイアログ関数を別のスレッドから呼び出すことはできません。これにより、Tk アプリ全体が強制終了されます。私は何をすべきか?

4

1 に答える 1

0

filedialogオプションがありparentます。非表示のウィンドウに変更して、ルート ウィンドウがブロックされないようにすることができます。

from tkinter import filedialog as tkFileDialog
from tkinter import *

def ask_open():
    p = hidden if attach_to_hidden.get() else root
    tkFileDialog.Open(parent=p).show()

root = Tk()
hidden = Toplevel()
hidden.withdraw()

attach_to_hidden = IntVar()
Checkbutton(root, text='Attach to hidden window', variable=attach_to_hidden).pack()
Button(root, text='Open', command=ask_open).pack()

root.mainloop()
于 2013-04-20T10:04:40.993 に答える