如何在 GUI 中使用按钮打开单独的、可编辑的窗口?
Posted
技术标签:
【中文标题】如何在 GUI 中使用按钮打开单独的、可编辑的窗口?【英文标题】:How to open individual, editable windows with buttons in GUI? 【发布时间】:2021-11-23 21:53:49 【问题描述】:我正在尝试为公司的在线租赁设备创建 GUI。它应该有一个带有标题和 5 个按钮的起始页面,用于各种类别的租赁。用户单击一个按钮,将打开一个新页面,其中包含标题、文本正文和一个复选框以创建订单。 我目前面临的问题是如何让按钮生成一个我可以编辑的独特页面。它目前会创建一个新窗口,但我不确定如何向其中添加文本? 我几乎是一个完全的新手,所以请记住这一点。 代码如下:
from tkinter import *
Window = Tk()
def Open():
New_Window = Tk()
lbl = Label(New_Window, text="Water Damage Equipment")
New_Window.mainloop()
# buttons for rental options
Btn1 = Button(text="Extractors/Cleaners", command=Open)
Btn1.pack()
Btn1 = Button(text="Air Movers/Fans", command=Open)
Btn1.pack()
Btn1 = Button(text="Dehumidifers", command=Open)
Btn1.pack()
Btn1 = Button(text="Air Filtration", command=Open)
Btn1.pack()
Btn1 = Button(text="Generators", command=Open)
Btn1.pack()
Window.mainloop()
root = Tk()
def command():
Toplevel(root)
button = Button(root, text="4 Dry Out e-Rental", command=command)
button.pack()
root.mainloop()
【问题讨论】:
您似乎在使用第三方模块 (breezypythongui
) 来做事,所以我建议您研究它的文档和其中的任何示例来回答您自己的问题。
从它的文档中我不认为breezypythongui
支持多个窗口,因为它的addButton()
、addLabel()
等...方法没有指定哪个窗口或Frame
是它们的参数“大师”就像他们的tkinter
同行一样。您似乎还试图为每个窗口创建一个单独的 Tk
实例,虽然这是可能的,但它也是有问题的 - 请参阅 Why are multiple instances of Tk discouraged?。 IMO 更好的方法是创建单独的 Toplevel
小部件。
这里有一个关于Toplevel
小部件的小文档。
我查看了breezypythongui
源代码,不容易修改它以支持多个窗口。如果您想避免直接学习如何使用tkinter
,因为您觉得它太复杂或文档记录太差,我知道还有一个基于它的简化模块,由 John Zelle 教授命名为graphics.py
,确实如此 支持多个窗口并且有文档——如果你感兴趣的话,甚至还有一本书。您可以在此站点上搜索标记为“[zelle-graphics]”的问题,以了解其使用方式。
@martineau 自从我阅读您的评论以来,我一直在研究 Tkinter 和 Toplevel 小部件——感谢您提及它们。我知道它非常受欢迎,因此学习很有价值,并且相信我将能够通过一些参考和阅读更多教程/示例来重写程序。在使用 Tkinter/Toplevel 开发这个程序时,您有什么建议吗?
【参考方案1】:
使用 tkinter 可能会很棘手。我构建了一个名为 easy_gui
的库来包装 tkinter 并简化此类项目;你可能会发现这里很方便。
查看以下代码,了解设置您描述的大部分功能的示例。要真正“创建订单”,您可能需要在 create_order
函数中进行更多操作。
主窗口中的每个按钮都需要一个command_func
函数,该函数在单击时被触发。我建议向GUI
类添加方法,例如extractors_cleaners
,以分别处理每个按钮。
在extractors_cleaners
方法中,创建新窗口完全由with self.popup() as popup:
行处理。只需根据需要将小部件添加到popup
即可操作新窗口。代码有点密集,但弹出窗口中的“创建订单”按钮调用create_order
函数并传入我们在新窗口中生成的文本。
import easy_gui
def create_order(text):
with open('order_form.txt', 'w') as f:
f.write(text)
class GUI(easy_gui.EasyGUI):
def __init__(self):
self.title('Order Forms') # set title of GUI window
self.add_widget('button', 'Extractors/Cleaners', command_func=self.extractors_cleaners)
self.add_widget('button', 'Air Movers/Fans', command_func=self.air_movers)
self.add_widget('button', 'Dehumidifiers', command_func=self.dehumidifiers)
self.add_widget('button', 'Air Filtration', command_func=lambda *args: print('...'))
self.add_widget('button', 'Generators', command_func=lambda *args: print('...'))
def extractors_cleaners(self, *args): # gets called when associated button is clicked
with self.popup() as popup: # generate a popup window
popup.geometry('500x600') # size of popup window
popup.add_widget('label', 'Extractors/Cleaners Order Form', underline=True, bold=True)
popup.add_widget('label', 'Order Details...\nMore Details...')
text = popup.add_widget('scrolledtext')
checkbox = popup.add_widget('checkbox', 'Fast Order?')
def order_text(): # read status of 'text' and 'checkbox' widgets and return a string
return '---FAST ORDER---\n' + '\n'.join(text.get()) if checkbox.get() else '\n'.join(text.get())
popup.add_widget('button', 'Create Order', command_func=lambda *args: create_order(order_text()))
def air_movers(self, *args):
...
def dehumidifiers(self, *args):
...
GUI()
不幸的是,目前没有太多关于 easy_gui
的文档,但这里还有一些示例:
https://github.com/zachbateman/easy_gui
【讨论】:
不是最original name。 也许不是,但希望代码比原始名称更有用。 @Zach Bateman 它说“ModuleNotFoundError: No module named 'easy_gui'” 我该如何导入这个? @Lady 您需要安装该软件包,因为它不在 Python 标准库中。尝试在命令窗口中运行pip install easy_gui
。安装后,代码中的import easy_gui
行应该可以工作。这里有更多关于使用pip
的信息:docs.python.org/3/installing/index.html
我试过安装这样的,但是在我的终端“-bash: pip: command not found”中收到了这个代码。如果这是问题所在,我使用的是 Chromebook?但 Linux 与我的 Chrome 操作系统一起运行。以上是关于如何在 GUI 中使用按钮打开单独的、可编辑的窗口?的主要内容,如果未能解决你的问题,请参考以下文章
JAVA的GUI中如何实现按下某个按钮后关闭当前窗口,打开新的窗口?
如何通过单击tkinter中不同窗口中的按钮来获取位于窗口中的GUI文本字段的参数? [重复]
Python 3.5,单独窗口中的 pyqt5 进度条 gui