当前位置: 首页 > article >正文

【Python】使用globals()函数成功解决tkinter多个新窗口问题

我在近期的一个项目(tkinter复刻记事本)上遇到一个很有意思的问题:如何在创建多个新窗口后,每个窗口还能独立运行?当时我尝试几种方法,奈何实力不足,于是便下定结论非使用线程不可,至此头发又少了一撮。直到今天我复盘了一下tkinter创建窗口有哪几种方式时,我在心中默念“早起的虫子被鸟吃......”,于是就顺理成章地解决了多窗口的问题。即使祭出“断子绝孙拳”,还是难不倒他“去骗、去偷袭一个69岁的同志”。于是如何产生新的变量名又成了新的拦路虎,总不能我提前定义好空的变量名吧!这样的话,新窗口个数就会有上限。

今天我非常幸运,我遇到了globals()函数,于是这个“法外狂徒张三”在本篇文章将“判处死刑,反复执行”。

globals()函数简单示例:

name = "zhouhua"

# 通过globals()函数将字符串作为变量名添加到全局作用域中
globals()[name] = "周华"

print(zhouhua)      # 输出:周华

多个窗口独立运行代码示例:

"""
    使用globals()函数成功解决tkinter多个新窗口问题

注意:
    1、Python的注释有两种:一种是单行注释,使用符号'#';另一种是多行注释,使用符号''' '''或""" """
    2、类的的函数通常叫'xxx方法';变量通常叫'xxx属性'

"""

# 通配符'*'
__all__ = ['main']


import tkinter as tk
from tkinter import ttk


class Window(tk.Tk):
    """继承tkinter.Tk()方法,创建桌面窗口"""

    def __init__(self):
        """构造方法"""

        super().__init__()                  # 调用父类(Tk)的构造方法(等价于root = tk.Tk())
        self.title('自定义标题')             # 窗口标题
        self.geometry('400x300+400+200')    # 窗口像素大小(400x300)及显示位置(400+200)

        # 显示文本内容
        self.showTextButton = tk.Button(self, text='获取文本内容', command=self.showData)
        self.showTextButton.pack(side=tk.BOTTOM)

        # 新窗口
        self.newWindowButton = tk.Button(self, text='新窗口', command=newWindow)
        self.newWindowButton.pack(side=tk.BOTTOM)

        # 文本域
        self.text = tk.Text(self, background='pink', font=('Tahoma', 16))
        self.text.pack(fill=tk.BOTH, expand=True)
        self.text.bind('<KeyRelease>', self.getTextData)    # 捆绑按键释放事件
        self.text.focus_set()                               # 设置焦点


    # 显示文本内容
    def showData(self, event=None):
        self.newWin = tk.Toplevel()                 # 创建新窗口
        self.newWin.title('自定义标题')              # 窗口标题
        self.newWin.geometry('300x200+450+240')     # 窗口像素大小(300x200)及显示位置(450+240)
        self.newWin.focus_set()                     # 设置焦点

        # 标签
        self.dataLabel = ttk.Label(self.newWin, text=self.text.get('1.0', tk.END), anchor='nw', relief=tk.GROOVE)
        self.dataLabel.pack(fill=tk.BOTH, expand=True)

        # 关闭
        self.closeButton = ttk.Button(self.newWin, text='关闭', command=self.newWin.destroy)
        self.closeButton.pack(side=tk.BOTTOM)


    # 获取文本域数据
    def getTextData(self, event=None):
        print([self.text.get('1.0', tk.END)])


# 新窗口
count = 0
def newWindow():
    global count
    count += 1

    # 将字符串赋值给变量名
    buf = f"ui{count}"

    # 通过globals()函数将字符串作为变量名添加到全局作用域中
    globals()[buf] = Window()


# 主函数
def main():
    pass

# 代码测试
if __name__ == '__main__':
    ui = Window()
    ui.mainloop()
else:
    print(f'导入{__name__}模块')

运行结果

作者:周华

创作日期:2023/11/26


http://www.kler.cn/a/146564.html

相关文章:

  • Kylin Linux V10 替换安装源,并在服务器上启用 EPEL 仓库
  • Windows部署NVM并下载多版本Node.js的方法(含删除原有Node的方法)
  • linux mysql 备份
  • Vue2+OpenLayers给标点Feature添加信息窗体(提供Gitee源码)
  • C# 25Dpoint
  • 图解Git——分支开发工作流《Pro Git》
  • hdlbits系列verilog解答(Exams/m2014 q4h)-44
  • ros2智能小车中STM32地盘需要用到PWM的模块
  • C++——解锁string常用接口
  • Flutter桌面应用开发之毛玻璃效果
  • Google codelab WebGPU入门教程源码<4> - 使用Uniform类型对象给着色器传数据(源码)
  • C#,《小白学程序》第一课:初识程序,变量,数据与显示
  • 时间序列预测 — LSTM实现多变量多步负荷预测(Keras)
  • 【计算机基础】通过插件plantuml,实现在VScode里面绘制状态机
  • Linux C语言 27-递归
  • 【多线程】-- 04 静态代理模式
  • 蓝桥杯每日一题2023.11.25
  • pop链反序列化 [MRCTF2020]Ezpop1
  • AIGC系列之:Transformer原理及论文解读
  • MacOS “xxxxx“,已损坏,无法打开,你应该将它移到废纸篓
  • 【前沿技术了解】web图形Canvas、svg、WebGL、数据可视化引擎的技术选型
  • 【03】命令行与环境变量
  • MySQL基本SQL语句(上)
  • github国内访问小解(windows)
  • openpnp - 给底部相机加防尘罩
  • mysql常见的十种错误简要说明