我刚刚开始学习如何创建一个自定义弹出对话框;事实证明,tkinter messagebox
非常容易使用,但也不会做太多。下面是我创建一个对话框的尝试,该对话框将接受输入,然后将其存储在用户名中。
我的问题是推荐的实现方式是什么?正如布莱恩·奥克利在this comment中所建议的。
I would advise against using a global variable. Instead of having the dialog destroy itself, have it destroy only the actual widget but leave the object alive. Then, call something like
inputDialog.get_string()
and thendel inputDialog
from your main logic.
也许使用全局变量返回我的字符串不是最好的主意,但是为什么呢?建议的方法是什么?我很困惑,因为我不知道如何在窗口被破坏后触发getstring,而且。。。关于销毁实际小部件的行,我不确定他是否指的是TopLevel
。
我问这个问题的原因是,我希望在按下submit按钮后弹出框被销毁;因为毕竟,我希望它恢复到主程序,更新一些东西等等。在这种情况下,button方法send
应该怎么做?因为在这个特定的例子中,如果用户愿意的话,允许他一遍又一遍地做这件事。
import tkinter as tk
class MyDialog:
def __init__(self, parent):
top = self.top = tk.Toplevel(parent)
self.myLabel = tk.Label(top, text='Enter your username below')
self.myLabel.pack()
self.myEntryBox = tk.Entry(top)
self.myEntryBox.pack()
self.mySubmitButton = tk.Button(top, text='Submit', command=self.send)
self.mySubmitButton.pack()
def send(self):
global username
username = self.myEntryBox.get()
self.top.destroy()
def onClick():
inputDialog = MyDialog(root)
root.wait_window(inputDialog.top)
print('Username: ', username)
username = 'Empty'
root = tk.Tk()
mainLabel = tk.Label(root, text='Example for pop up input box')
mainLabel.pack()
mainButton = tk.Button(root, text='Click me', command=onClick)
mainButton.pack()
root.mainloop()
我用了Honest Abe's 2nd part of the code标题:
并做了一些修改。我需要一个组合框而不是条目,所以我也实现了它。如果你需要其他东西,应该很容易修改。
以下是更改内容
删除
将以下文件另存为
mbox.py
中的your_python_folder\Lib\site-packages
或与主GUI文件位于同一文件夹中。它应该是快速和容易使用。下面是一个例子:
由于对象inputDialog没有被破坏,所以我能够访问对象属性。我添加了返回字符串作为属性:
在想到的两个场景中,使用global statement是不必要的。
编写一个对话框,该对话框可以导入以与主图形用户界面一起使用
在创建对话框实例时,可以通过传递dictionary&key来避免全局语句。然后可以使用lambda将字典键与按钮的命令关联起来。这将创建一个匿名函数,在按下按钮时执行函数调用(带参数)。
通过将父对象绑定到类属性(本例中为根),可以避免每次创建对话框实例时都需要传递父对象。
您可以将以下文件保存为
mbox.py
中的your_python_folder\Lib\site-packages
或与主GUI文件位于同一文件夹中。您可以在effbot上看到子类TopLevel和tkSimpleDialog(py3中的tkinter.simpledialog)的示例。
值得注意的是,ttk widgets可以与本例中的tkinter小部件互换。
要使对话框精确居中,请阅读→this。
使用示例:
编写一个对话框,可以导入该对话框以使用而不使用主图形用户界面
创建包含对话框类(此处为MessageBox)的模块。此外,还包括一个函数,该函数创建该类的实例,并最终返回按下的按钮的值(或来自Entry小部件的数据)。
下面是一个完整的模块,您可以在这些引用的帮助下进行自定义:NMTech&;Effbot。
在
your_python_folder\Lib\site-packages
中将以下代码另存为mbox.py
以及:
在mbox创建MessageBox的实例之后,它将启动主循环,
在通过
root.quit()
退出主循环之前有效地停止那里的函数。然后,mbox函数可以访问
msgbox.returning
,并返回其值。示例:
相关问题 更多 >
编程相关推荐