Python tkinter模块弹出窗口及传值回到主窗口操作详解

参考:https://www.jb51.net/article/119817.htm

注意在多窗口复用时,要把class MyApp(tk.Tk):改成class MyApp(tk.Toplevel):,不然会报错。

import tkinter as tk
'''松耦合'''
# 弹窗
class MyDialog(tk.Toplevel):
  def __init__(self):
    super().__init__()
    self.title('设置用户信息')
    # 弹窗界面
    self.setup_UI()
  def setup_UI(self):
    # 第一行(两列)
    row1 = tk.Frame(self)
    row1.pack(fill="x")
    tk.Label(row1, text='姓名:', width=8).pack(side=tk.LEFT)
    self.name = tk.StringVar()
    tk.Entry(row1, textvariable=self.name, width=20).pack(side=tk.LEFT)
    # 第二行
    row2 = tk.Frame(self)
    row2.pack(fill="x", ipadx=1, ipady=1)
    tk.Label(row2, text='年龄:', width=8).pack(side=tk.LEFT)
    self.age = tk.IntVar()
    tk.Entry(row2, textvariable=self.age, width=20).pack(side=tk.LEFT)
    # 第三行
    row3 = tk.Frame(self)
    row3.pack(fill="x")
    tk.Button(row3, text="取消", command=self.cancel).pack(side=tk.RIGHT)
    tk.Button(row3, text="确定", command=self.ok).pack(side=tk.RIGHT)
  def ok(self):
    self.userinfo = [self.name.get(), self.age.get()] # 设置数据
    self.destroy() # 销毁窗口
  def cancel(self):
    self.userinfo = None # 空!
    self.destroy()
# 主窗
class MyApp(tk.Toplevel):
  def __init__(self):
    super().__init__()
    #self.pack() # 若继承 tk.Frame ,此句必须有!
    self.title('用户信息')
    # 程序参数/数据
    self.name = '张三'
    self.age = 30
    # 程序界面
    self.setupUI()
  def setupUI(self):
    # 第一行(两列)
    row1 = tk.Frame(self)
    row1.pack(fill="x")
    tk.Label(row1, text='姓名:', width=8).pack(side=tk.LEFT)
    self.l1 = tk.Label(row1, text=self.name, width=20)
    self.l1.pack(side=tk.LEFT)
    # 第二行
    row2 = tk.Frame(self)
    row2.pack(fill="x")
    tk.Label(row2, text='年龄:', width=8).pack(side=tk.LEFT)
    self.l2 = tk.Label(row2, text=self.age, width=20)
    self.l2.pack(side=tk.LEFT)
    # 第三行
    row3 = tk.Frame(self)
    row3.pack(fill="x")
    tk.Button(row3, text="设置", command=self.setup_config).pack(side=tk.RIGHT)
  # 设置参数
  def setup_config(self):
    # 接收弹窗的数据
    res = self.ask_userinfo()
    #print(res)
    if res is None: return
    # 更改参数
    self.name, self.age = res
    # 更新界面
    self.l1.config(text=self.name)
    self.l2.config(text=self.age)
  # 弹窗
  def ask_userinfo(self):
    inputDialog = MyDialog()
    self.wait_window(inputDialog) # 这一句很重要!!!
    return inputDialog.userinfo
if __name__ == '__main__':
  app = MyApp()
  app.mainloop()

参考:https://blog.csdn.net/qq_27061049/article/details/90168116
这个是获得时间的写法
在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来解答你的问题。 在Python中,使用tkinter模块可以创建GUI应用程序。要实现子窗口返回数据给窗口,可以按照以下步骤进行操作: 1. 在窗口中创建一个按钮,当用户点击该按钮时,弹出窗口。 2. 在子窗口中创建需要的控件,比如输入框、下拉框等,让用户输入数据。 3. 在子窗口中创建一个“确认”按钮,当用户点击该按钮时,将用户输入的数据传回给窗口。 4. 在窗口中定义一个函数,用于接收子窗口传回的数据。 5. 在子窗口中,使用`tk.Toplevel()`方法创建一个新窗口,并将该窗口设置为子窗口。 6. 在子窗口中,使用`self.master`来获取窗口对象,并在子窗口中调用窗口中定义的函数,将数据传回给窗口。 下面是一个示例代码,用于演示如何实现子窗口返回数据给窗口: ```python import tkinter as tk class SubWindow(tk.Toplevel): def __init__(self, master=None): super().__init__(master) self.master = master tk.Label(self, text="请输入数据:").grid(row=0, column=0) self.entry = tk.Entry(self) self.entry.grid(row=0, column=1) tk.Button(self, text="确认", command=self.submit).grid(row=1, column=0, columnspan=2) def submit(self): data = self.entry.get() self.master.receive_data(data) self.destroy() class MainWindow(tk.Frame): def __init__(self, master=None): super().__init__(master) self.master = master tk.Button(self, text="打开子窗口", command=self.open_subwindow).pack() self.data_label = tk.Label(self, text="") self.data_label.pack() def open_subwindow(self): SubWindow(self) def receive_data(self, data): self.data_label.config(text=f"你输入的数据是:{data}") if __name__ == "__main__": root = tk.Tk() app = MainWindow(root) app.pack() root.mainloop() ``` 在上面的代码中,我们定义了一个`SubWindow`类作为子窗口,该类继承自`tk.Toplevel`。在子窗口中,我们创建了一个输入框和一个“确认”按钮,当用户点击“确认”按钮时,将用户输入的数据传回给窗口。 在窗口中,我们定义了一个`MainWindow`类,该类继承自`tk.Frame`。在该类中,我们创建了一个按钮,当用户点击该按钮时,会弹出窗口。同时,我们还定义了一个`receive_data`函数,用于接收子窗口传回的数据,并将数据显示在标签上。 在函数中,我们创建了一个`Tk`对象,并将`MainWindow`对象添加到该对象中。然后启动了事件循环,等待用户与应用程序进行交互。 希望这个回答能够解决你的问题。如果你还有其他问题,可以继续向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值