gpt4 book ai didi

python - 如何在 TkInter 中创建子窗口并与父窗口通信

转载 作者:太空狗 更新时间:2023-10-29 21:29:44 25 4
gpt4 key购买 nike

我正在使用 TkInter 创建一些对话框,并且需要能够在单击父级中的按钮时打开子子窗口(模态或非模态)。然后,子窗口将允许创建数据记录,并且需要将此数据(记录或操作被取消)传回父窗口。到目前为止,我有:

import sel_company_dlg

from Tkinter import Tk

def main():
root = Tk()
myCmp = sel_company_dlg.SelCompanyDlg(root)
root.mainloop()

if __name__ == '__main__':
main()

这将调用允许用户选择公司的顶层对话框。公司选择对话框如下所示:

class SelCompanyDlg(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent_ = parent
self.frame_ = Frame( self.parent_ )
// .. more init stuff ..
self.btNew_ = Button( self.frame_, text="New ...", command=self.onNew )

def onNew(self):
root = Toplevel()
myCmp = company_dlg.CompanyDlg(root)

单击新建... 按钮时,将显示一个创建公司对话框,允许用户填写公司详细信息并单击创建或取消。这是它的开头部分:

class CompanyDlg(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
// etc.

我正在努力寻找在 onNew() 中调用子对话框的最佳方式 - 我的工作有效但我不相信这是最好的方法,而且我看不到如何与子对话交流细节。

我尝试查看在线教程/引用资料,但我发现要么过于简单,要么专注于诸如 tkMessageBox.showinfo() 之类的内容,这不是我想要的。

最佳答案

至少有几种方法可以解决您的问题。您的对话框可以直接向主应用程序发送信息,或者您的对话框可以生成一个事件,告诉主应用程序确实要从对话框中提取数据。如果对话框只是简单地改变了某些东西的外观(例如,字体对话框),我通常会生成一个事件。如果对话框创建或删除数据,我通常会让它把信息推送回应用程序。

我通常有一个应用程序对象作为整个 GUI 的 Controller 。通常这与主窗口是同一个类,或者它可以是一个单独的类,甚至可以定义为一个 mixin。此应用程序对象具有对话框可以调用以将数据馈送到应用程序的方法。

例如:

class ChildDialog(tk.Toplevel):
def __init__(self, parent, app, ...)
self.app = app
...
self.ok_button = tk.Button(parent, ..., command=self.on_ok)
...
def on_ok(self):
# send the data to the parent
self.app.new_data(... data from this dialog ...)

class MainApplication(tk.Tk):
...

def on_show_dialog(self):
dialog = ChildDialog(self)
dialog.show()

def new_data(self, data):
... process data that was passed in from a dialog ...

创建对话框时,您传入对应用程序对象的引用。然后对话知道调用此对象的特定方法以将数据发送回应用程序。

如果您不了解整个模型/ View / Controller ,您可以轻松地传入一个函数而不是一个对象,有效地告诉对话框“当你想给我数据时调用这个函数”。

关于python - 如何在 TkInter 中创建子窗口并与父窗口通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10718073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com