本文实例讲述了Python tkinter模块弹出窗口及传值回到主窗口操作。分享给大家供大家参考,具体如下:

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

一、标准窗口

如果只对一个参数进行设置(或者说从弹出窗口取回一个值),那么可以使用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()

效果图

希望本文所述对大家Python程序设计有所帮助。

python的窗口处理模块_Python tkinter模块弹出窗口及传值回到主窗口操作详解相关推荐

  1. python diango 增删改查_python中关于django对数据库Mysql的增删改查操作详解

    下面小编就为大家带来一篇python django 增删改查操作 数据库Mysql.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 下面介绍一下django增删改查操作: ...

  2. python微信自动发消息_Python使用微信itchat接口实现查看自己微信的信息功能详解...

    Python使用微信itchat接口实现查看自己微信的信息功能详解 发布时间:2020-09-09 04:20:11 来源:脚本之家 阅读:134 本文实例讲述了Python使用微信itchat接口实 ...

  3. python集合的并集、交集_Python 集合set()添加删除、交集、并集、集合操作详解

    1.在Python中set是基本数据类型的一种集合类型,它有可变集合(set())和不可变集合(frozenset)两种.创建集合set.集合set添加.集合删除.交集.并集.差集的操作都是非常实用的 ...

  4. python集合运算_Python 集合set()添加删除、交集、并集、集合操作详解

    在Python set是基本数据类型的一种集合类型,它有可变集合(set())和不可变集合(frozenset)两种.创建集合set.集合set添加.集合删除.交集.并集.差集的操作都是非常实用的方法 ...

  5. office是python打开方式_Python读取word文本操作详解

    本文研究的主要问题时Python读取word文本操作,分享了相关概念和实现代码,具体如下. 一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就 ...

  6. 用python处理excel的基本语法_Python对Excel操作详解

    Python对Excel操作详解 文档摘要: 本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd.xlwt和xlutils模块.另外还演示了如何通过Tcl tco ...

  7. pymssql mysql_Python数据库模块pymssql连接SQLServer数据库操作详解

    Python数据库模块pymssql连接SQLServer数据库操作详解 发布时间:2018-08-23 19:32, 浏览次数:720 , 标签: Python pymssql SQLServer ...

  8. JS 点击弹出图片/ 仿QQ商城点击左右滚动幻灯片/ 相册模块,点击弹出图片,并左右滚动幻灯片...

    1, 点击弹出图片 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  9. SAP S/4HANA WM模块前台操作详解--盘点作业

    盘点作业 1.概念介绍 在仓库管理中为了保持系统账和实物一致,经常需要对仓库中物料库存进行清点确认,一般有月度盘点,季度盘点和年度盘点等待 2.库存盘点的仓储位选择 2.1. 操作路径与事务码 后勤= ...

最新文章

  1. 用 Flask 来写个轻博客 (19) — 以 Bcrypt 密文存储账户信息与实现用户登陆表单
  2. python matplotlab.pyplot.axis()函数的用法
  3. JMeter基础之-使用技巧
  4. 南昌理工学院计算机网络技术专业怎么样,南昌理工学院怎么样 重点专业是什么...
  5. 递归和对面对象编程初步
  6. [转]VB:如何检测到U盘的插拔(源代码)
  7. Nginx gzip参数详解及常见问题(已解决)
  8. 管理感悟:技术文档有用吗
  9. h5自我介绍作品_自我介绍h5模板
  10. 施耐德 m340 编程手册_施耐德电气自动化软件汇总
  11. dorado关于下拉框的的onSelect()方法
  12. 第939期机器学习日报(2017-04-14)
  13. 科众集团聚力呈现2019创新服务峰会——“碰撞·革新”
  14. C51单片机,基于LCD液晶屏的简易时钟
  15. 基于jQuery仿QQ音乐播放器网页版代码
  16. Ubuntu运行多个命令
  17. 2022世界十大最佳医院介绍
  18. 一本看到技巧又能保持阳光心态励志书(来自苏鹏的推荐)——《程序员羊皮卷》连载(4)
  19. python下载整个网站_python – Selenium下载整个HTML
  20. 【RFID】射频低噪声放大器的设计

热门文章

  1. 图解使用Win8Api进行Metro风格的程序开发二----使用文件选择器访问和保存文件
  2. 【机器学习】HOG detectMultiScale 参数分析
  3. ZooKeeper 如何保证数据一致性
  4. shell 实例收集
  5. linux无法访问mysql_Linux下MySQL无法访问问题排查的基本步骤
  6. html转word保留样式_译员必备 | 初识Word格式标记
  7. centos6查看java命令_linux 常用命令(五)——(centos7-centos6.8)JDK安装
  8. Weka学习二(聚类算法)
  9. raspberry树莓派NFS搭建
  10. Linux小工具(4)之apt软件管理