我正在创建一个tkinter画布,我需要检查用户何时更改窗口的大小。问题是,最初窗口显然不是它应该的大小。我有以下内容:
def print_size(self):
print self.root.winfo_width()
def init_simulation(self, size=300):
self.root = Tk()
canvas = Canvas(self.root, width=size, height=size)
self.print_size()
self.root.after(1000, self.print_size)
运行时,我得到:
1
又过了一秒钟:
306
忽略tkinter将增加6个像素的事实,为什么大小先是1然后是306?我设置错了吗?
答案 0 :(得分:2)
当您使用Tk()
实例化根小部件时,Tkinter会在单独的线程中启动一个进程来实际创建窗口 - 它不会发生在主循环中。
最初获得1
大小的原因是,当您第一次调用self.print_size
时,根窗口仍然不存在,因此它为您提供了默认值{{1 }}。下次你稍后调用它时,窗口已经完成产生,所以它给出了实际的大小。它本质上是一个竞争条件 - 在创建self.root之前,主事件循环到达1
。
如果您想更改此行为,请在print self.root.winfo_width()
之后添加此行:
self.root = Tk()
该命令强制主事件循环暂停,直到给定的窗口小部件(在本例中为根窗口)已生成并且可见。
另外,请注意,您已将画布的大小设置为300像素,因此容器窗口自然会有一些额外的宽度。