tkinter根窗口的大小不是很合适

时间:2013-08-18 21:26:48

标签: python python-2.7 tkinter tkinter-canvas

我正在创建一个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?我设置错了吗?

1 个答案:

答案 0 :(得分:2)

当您使用Tk()实例化根小部件时,Tkinter会在单独的线程中启动一个进程来实际创建窗口 - 它不会发生在主循环中。

最初获得1大小的原因是,当您第一次调用self.print_size时,根窗口仍然不存在,因此它为您提供了默认值{{1 }}。下次你稍后调用它时,窗口已经完成产生,所以它给出了实际的大小。它本质上是一个竞争条件 - 在创建self.root之前,主事件循环到达1

如果您想更改此行为,请在print self.root.winfo_width()之后添加此行:

self.root = Tk()

该命令强制主事件循环暂停,直到给定的窗口小部件(在本例中为根窗口)已生成并且可见。

另外,请注意,您已将画布的大小设置为300像素,因此容器窗口自然会有一些额外的宽度。