1

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

4

1 回答 1

2

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

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

如果您想更改此行为,请在后面添加此行self.root = Tk()

self.root.wait_visibility(self.root)

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

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

于 2013-08-18T22:35:35.800 回答