Python tkinter根窗口不是';尺寸不太合适

Python tkinter根窗口不是';尺寸不太合适,python,python-2.7,tkinter,tkinter-canvas,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()

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

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

初始大小为
1
的原因是,当您第一次调用
self.print\u size
时,根窗口还不存在,因此它会为您提供一个默认值
1
。下次您稍后调用它时,窗口已完成繁殖,因此它会给出实际大小。它本质上是一种竞争条件-在创建self.root之前,主事件循环到达
print self.root.winfo_width()

如果要更改此行为,请在
self.root=Tk()之后添加此行:

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


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

为什么根窗口还不存在,我称之为根窗口,并使用它。添加了更多说明-这是否清楚?如果你想改变你注意到的行为,我也给了你一个解决办法。
self.root.wait_visibility(self.root)