如何使用tix.DirSelectDialog?

1 投票
1 回答
1969 浏览
提问于 2025-04-18 14:15

作为一个替代方案,我发现了 tix.DirSelectDialog,而不是使用 tkinter.filedialog.askdirectory
可惜的是,我就是搞不懂怎么用它。我发现有一个 __init__(self, master) 方法,但我特别不知道“self”应该是什么。

我的目标是通过在主窗口中按一个按钮来触发一个选择目录的对话框,并把选中的目录存储在一个变量中,以便以后使用。我建议这个适用于 Python 3.3 的简化示例:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from tkinter import *
import tkinter.tix as tix

root = Tk()

def pathSelect():
    d = tix.DirSelectDialog.__init__(self=???, master=root)
    if d != "":
        print(d)

button = Button(root, text="dialog", command=pathSelect)
button.pack()

root.mainloop()

如果这个能正常工作,是否就足够实现我想要的功能呢?

网上关于这个主题的信息不多。我找到的两个参考链接是:
http://sourcecodebrowser.com/python3.2/3.2.3~rc2/classtkinter_1_1tix_1_1_dir_select_dialog.html#ae545b097538938871e9576b83fc664be
http://epydoc.sourceforge.net/stdlib/Tix.DirSelectDialog-class.html
这些链接总是在重复语法,但我却无法利用这些信息。也许其他编程水平更高的人能做到?经过三小时的无果研究和实验,我只希望能有一个简单的示例。

非常感谢!


编辑:

在应用了 furas 提出的修复后:

d = tix.DirSelectDialog(master=root)

我意外地遇到了这个错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files\Python\lib\tkinter\__init__.py", line 1442, in __call__

    return self.func(*args)
  File "dirdialog.py", line 10, in pathSelect
    d = tix.DirSelectDialog(master=root)
  File "C:\Program Files\Python\lib\tkinter\tix.py", line 762, in __init__
    ['options'], cnf, kw)
  File "C:\Program Files\Python\lib\tkinter\tix.py", line 322, in __init__
    self.tk.call(widgetName, self._w, *extra)
_tkinter.TclError: invalid command name "tixDirSelectDialog"

这个错误似乎是来自 tix,但库里不应该有错误,对吧?有没有人能对此给出答案?


解决方案(感谢 furas)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from tkinter import *
import tkinter.tix as tix

root = tix.Tk()

def print_selected(args):
    print('selected dir:', args)

def pathSelect():
    d = tix.DirSelectDialog(master=root, command=print_selected)
    d.popup()

button = Button(root, text="dialog", command=pathSelect)
button.pack()

root.mainloop()

1 个回答

1

像往常一样创建实例:

d = tix.DirSelectDialog(master=root)

这段代码会执行 tix.DirSelectDialog.__init__(self, master),并为 self 提供正确的参数。


你可以把

d = tix.DirSelectDialog(master=root)

看作是代码在内部被 Python 执行的过程。

tix.DirSelectDialog(self=d, master=root)

# which executes

tix.DirSelectDialog.__init__(self=d, master=root)

但通常情况下,你是不能这样做的。


编辑:要正常运行这个,你可能需要自己安装 Tix(Tcl/Tk 的扩展),并用 tix.Tk() 替代 tkinter.Tk()

这是一个适用于 Python 2 的工作示例:

import Tix as tix

def print_selected(args):
    print('selected dir:', args)

root = tix.Tk()
dialog = tix.DirSelectDialog(root, command=print_selected)
dialog.popup()

这是一个适用于 Python 3 的类似示例(但我在我的电脑上遇到了一些问题,无法正常运行)。

import tkinter.tix as tix

def print_selected(args):
    print('selected dir:', args)

root = tix.Tk()
dialog = tix.DirSelectDialog(root, command=print_selected)
dialog.popup()

撰写回答