有些时候,我们需要使用弹出窗口,对程序的运行参数进行设置。有两种选择

一、标准窗口

如果只对一个参数进行设置(或者说从弹出窗口取回一个值),那么可以使用simpledialog,导入方法:

from tkinter.simpledialog import askstring, askinteger, askfloat
完整例子
import tkinter as tk
from tkinter.simpledialog import askstring, askinteger, askfloat # 接收一个整数
def print_integer():
res = askinteger("Spam", "Egg count", initialvalue=12*12)
print(res) # 接收一个浮点数
def print_float():
res = askfloat("Spam", "Egg weight\n(in tons)", minvalue=1, maxvalue=100)
print(res) # 接收一个字符串
def print_string():
res = askstring("Spam", "Egg label")
print(res) root = tk.Tk() tk.Button(root, text='取一个字符串', command=print_string).pack()
tk.Button(root, text='取一个整数', command=print_integer).pack()
tk.Button(root, text='取一个浮点数', command=print_float).pack() root.mainloop()

二、自定义窗口

如果要设置的参数个数超过两个,那么tkinter提供的标准窗口就处理不了了。

这就需要自定义一个窗口,那么问题来了:怎样将自定义窗口中的数据传回主窗口?

百度查询,不外乎两种方法:全局变量(global)、对象变量([]、{}等),都不是我想要的。

然后,去 stackoverflow 逛了一下,综合了个问题的答案,得到两个本人比较满意的方案。

一种是松耦合,另一种是紧耦合

1)松耦合

说明

  • 主窗类,继承了 tk.Tk
  • 弹窗类,继承了 tk.Toplevel

要点

  • 弹窗,将多个数据,打包,放入一个名为 username 的私有 list 对象,销毁弹窗
  • 主窗,待弹窗运行后,通过wait_window方法,取得弹窗的名为 username 私有变量

完整代码:

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.Tk): 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()

2)紧耦合

说明

  • 主窗类,继承了 tk.Tk
  • 弹窗类,继承了 tk.Toplevel

要点

  • 弹窗,显式地保存父窗口,显式地修改父窗口数据,显式地更新父窗口部件,最后销毁弹窗
  • 主窗,待弹窗运行后,通过wait_window方法,返回 None

完整代码:

import tkinter as tk

'''紧耦合'''

# 弹窗
class PopupDialog(tk.Toplevel):
def __init__(self, parent):
super().__init__()
self.title('设置用户信息') self.parent = parent # 显式地保留父窗口 # 第一行(两列)
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.parent.name = self.name.get()
self.parent.age = self.age.get() # 显式地更新父窗口界面
self.parent.l1.config(text=self.parent.name)
self.parent.l2.config(text=self.parent.age) self.destroy() # 销毁窗口 def cancel(self):
self.destroy() # 主窗
class MyApp(tk.Tk): 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):
pw = PopupDialog(self)
self.wait_window(pw) # 这一句很重要!!! return if __name__ == '__main__':
app = MyApp()
app.mainloop()

效果图

tkinter 弹出窗口 传值回到 主窗口的更多相关文章

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

    这篇文章主要介绍了Python tkinter模块弹出窗口及传值回到主窗口操作,结合实例形式分析了Python使用tkinter模块实现的弹出窗口及参数传递相关操作技巧,需要的朋友可以参考下 本文实例 ...

  2. js制作带有遮罩弹出层实现登录小窗口

    要实现的效果如下 点击“登录”按钮后,弹出登录小窗口,并且有遮罩层(这个名词还是百度知道的,以前只知道效果,却不知道名字) 在没有点击“登录”按钮之前登录小窗口不显示,点击“登录”按钮后小窗口显示,并 ...

  3. PHP JS HTML ASP页面跳转代码 延时跳转代码 返回到上一界面并刷新 JS弹出指定大小的新窗口

    1.PHP延时跳转代码 //跳转到浏览界面 header("Refresh:1;url=machine_list.php"); //不延时 <?php header(&quo ...

  4. 如何禁用MySql总是定时弹出一个MySQLInstallerConsole.exe的窗口

    如何禁用MySql总是定时弹出一个MySQLInstallerConsole.exe的窗口 禁用mysql总是弹出一个安装框的定时任务这一条安装命令,Installing MySQL 5.6.21 u ...

  5. Python实现使用tkinter弹出输入框输入数字, 具有确定输入和清除功能

    Python3.6中用tkinter, 弹出可以输入数字的输入框. # Copyright (c) 2017-7-21 ZhengPeng All rights reserved. def pop_u ...

  6. WPF:验证登录后关闭登录窗口,显示主窗口的解决方法

    http://www.27ba.com/post/145.html WPF:验证登录后关闭登录窗口,显示主窗口的解决方法 最近想做一个基于Socket的通讯工具,想模仿QQ那样,需要先登录,登录成功后 ...

  7. 如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置

    用Qt Creator 设计程序时,最方便的就是ui设计器,可以很容易的得到想要的布局. 但是这样自动布局带来的后果是很难知道窗口中某一部件在主窗口中的相对位置. 在处理子窗口鼠标事件时变的很麻烦.主 ...

  8. Qt 子窗口监听主窗口信号

    Qt 子窗口监听主窗口信号(转载)  原文链接:https://www.cnblogs.com/ybqjymy/p/12169762.html 1 MainWindow *ptr = NULL; 2 ...

  9. 点击一个超链接,弹出固定大小的新窗口(js实现)

    1.最基本的弹出窗口代码 <SCRIPT LANGUAGE="javascript"> <!-- window.open ('page.html') --> ...

随机推荐

  1. 标准标签、<jsp:include>、<jsp:forward>

    使用方法 标准标签在jsp页面直接编写即可,因为标准标签是JSP规范提供的,所有容器都支持. 被替代性 标准标签的许多功能都可以被JSTL与EL表达式语言所替代. 作用 标准标签可协助编写JSP时减少 ...

  2. React Native常用第三方组件汇总--史上最全 之一

    React Native 项目常用第三方组件汇总: react-native-animatable 动画 react-native-carousel 轮播 react-native-countdown ...

  3. oracle数据库occi接口写入中文乱码解决方法

    将初始化代码中 Environment::createEnvironment(Environment::DEFAULT); 改为 Environment::createEnvironment(“UTF ...

  4. 2.Hibernate的主配置文件hibernate.cfg.xml

    1.配置 Hibernate 需要事先知道在哪里找到映射信息,这些映射信息定义了 Java 类怎样关联到数据库表.Hibernate 也需要一套相关数据库和其它相关参数的配置设置.所有这些信息通常是作 ...

  5. 三种方法实现java调用Restful接口

    1,基本介绍 Restful接口的调用,前端一般使用ajax调用,后端可以使用的方法比较多, 本次介绍三种: 1.HttpURLConnection实现 2.HttpClient实现 3.Spring ...

  6. 系统监控工具-glances

    作为运维不仅要时时监控系统,还需要优雅的装13,当别人还在命令的小黑框里敲打那个top命令去查看系统性能的时候,我们带你使用web端监控系统性能 glances 是利用Python语言开发,的监控工具 ...

  7. windows使用

    将桌面.我的文档.收藏夹等转移到其他盘 方法很多,介绍如下: 一.新装的系统,桌面.我的文档.收藏夹等都是默认在C盘的,并且这些数据都是用户经常用到的一些数据.为了避免以后系统崩溃所带来的危险,最好的 ...

  8. sysdate()简单用法

    环境: create table rq (xm varchar2(10),age number,zw varchar(10),rzrq date);insert into rq values ('小崔 ...

  9. CVE-2013-2551

    目录 小白的CVE-2013-2551 分析 & 利用 0xFF 前言 0x00 环境和工具 0x01 分析POC POC 调试 0x02 利用 构造R3任意内存读写 劫持eip 利用利用 0 ...

  10. mysql5.7.24启动报错:ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.

    报错原因是:密码过期.不管你是刚刚修改密码还是什么,只要登陆都是有问题的,都是报这样子的错误. 解决方法是: 1.修改/etc/my.cnf文件,在[mysqld]下加入“skip-grant-tab ...