如何在 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

如何从 GUI 中的编辑框中检索数据

如何添加使用 PyQt 移动窗口大小时移动的文本编辑、标签和按钮?

如何在没有按钮的情况下关闭tkinter窗口而不完全关闭Python?