前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tkinter mainloop() 循环的逻辑,以及变量为什么不会被重新赋值为初始值?

Tkinter mainloop() 循环的逻辑,以及变量为什么不会被重新赋值为初始值?

原创
作者头像
用户11021319
发布2024-04-30 09:55:48
2070
发布2024-04-30 09:55:48

1、问题背景

在使用 Tkinter 开发 GUI 程序时,您可能会遇到这样的疑问:为什么在使用 window.mainloop() 循环时,变量不会被重新赋值为它们的初始值?

从字面上理解,window.mainloop() 会不断重复 GUI 代码,以便窗口及其组件保持在屏幕上。既然如此,为什么一个变量(例如 canvastext)可以被更新并保持更新状态?难道 window.mainloop() 的逻辑不会覆盖 canvastext,使其再次具有文本值“Hi”,而不是新的 Spinbox 值吗?

也许我对 window.mainloop() 的作用完全误解了,但如果它确实使程序不断循环执行代码,那么为什么不将变量重新赋值为它们的初始值呢?

为了更好地说明问题,我们编写了以下代码:

代码语言:python
代码运行次数:0
复制
from tkinter import *

x = 10
y = 10
a = 100
b = 100

def hello():
    #print spin value
    print ("Spin Value:")
    number = v.get()
    print(number)
    #update text with variable value
    txt = v.get()
    global canvastext
    canvas1.delete(canvastext)
    canvas1.update()
    canvastext = canvas1.create_text(50, 50, text = txt)

window = Tk()
window.geometry("500x500")

#canvas and drawing
canvas1=Canvas(window, height = 200, width = 400)
canvas1.grid(row=0, column=0, sticky=W)
coord = [x, y, a, b]
rect = canvas1.create_rectangle(*coord, outline="#fb0", fill="#fb0")
canvastext = canvas1.create_text(50, 50, text ="Hi")

# create a toplevel menu
menubar = Menu(window)

firstmenu = Menu(menubar, tearoff=0)
firstmenu.add_command(label="Hello!", command=hello)
firstmenu.add_command(label="Quit!", command=window.destroy)
menubar.add_cascade(label="Menu1", menu=firstmenu)

secondmenu = Menu(menubar, tearoff=0)
secondmenu.add_command(label="Hi!", command=hello)
secondmenu.add_command(label="Quit!", command=window.destroy)
menubar.add_cascade(label="Menu2", menu=secondmenu)

window.config(menu=menubar)

#spinboxes and capturing value
v=IntVar()
spin = Spinbox(window, textvariable=v, from_=1, to = 10)
spin.grid(row=1, column = 0, sticky= W)

window.mainloop()

在以上代码中,我们创建了一个窗口,并在其中添加了一个画布、一个下拉列表和两个菜单。当用户选择下拉列表中的选项时,我们会更新画布上的文本,并将新文本显示出来。

2、解决方案

通过对 Tkinter 的源码进行分析,我们发现:

  • window.mainloop() 并不像我们想象的那样不断重复执行 GUI 代码。它只是不断地从事件队列中获取事件,然后将事件分发给相应的处理函数。
  • 处理函数可以修改变量的值,但不会影响其他代码中的变量。也就是说,变量的值只会在处理函数中被修改,而在其他代码中不会被修改。

因此,在上面的代码中,当用户选择下拉列表中的选项时,hello() 函数会被调用。hello() 函数会更新画布上的文本,并将新文本显示出来。但是,window.mainloop() 并不会重新执行 GUI 代码,所以其他代码中的变量(如 xyab)不会被修改。

希望这篇技术文章能够帮助您理解 Tkinter window.mainloop() 循环的逻辑,以及变量为什么不会被重新赋值为初始值。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、问题背景
  • 2、解决方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档