根据我的理解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()
答案 0 :(得分:4)
“从我的理解window.mainloop()不断重复GUI代码 这样窗口及其小部件就会停留在屏幕上“
不完全是。它不会“不断重复”任何内容,除了继续查找事件并为事件调度处理程序。它不会重新运行任何代码。 mainloop非常简单,与此没什么不同:
while (the_main_window_hasnt_been_destroyed):
event=event_queue.pop()
event.handle()
我不明白你关于变量重置的问题。事件循环本身不会改变任何东西。它只是等待事件,然后调用适当的处理程序。如果处理程序更改了变量,则会更改它。如果没有,它保持不变。