理解Tkinter mainloop()的逻辑以及为什么变量不会重新分配它们的原始值?

时间:2014-09-28 20:01:12

标签: python tkinter

根据我的理解window.mainloop()不断重复GUI代码,以便窗口及其小部件保留在屏幕上。那么,为什么变量(例如canvastext)可以更新并保持更新?当然window.mainloop()的逻辑将覆盖canvastext,以便它再次具有文本值'嗨'而不是新的spinbox值? 可能是因为我完全误解了window.mainloop()的作用,但如果它确实使程序在代码中循环,那么为什么不能将变量重新分配给它们的原始值呢?

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()

1 个答案:

答案 0 :(得分:4)

  

“从我的理解window.mainloop()不断重复GUI代码   这样窗口及其小部件就会停留在屏幕上“

不完全是。它不会“不断重复”任何内容,除了继续查找事件并为事件调度处理程序。它不会重新运行任何代码。 mainloop非常简单,与此没什么不同:

while (the_main_window_hasnt_been_destroyed):
    event=event_queue.pop()
    event.handle()

我不明白你关于变量重置的问题。事件循环本身不会改变任何东西。它只是等待事件,然后调用适当的处理程序。如果处理程序更改了变量,则会更改它。如果没有,它保持不变。