【问题标题】:tkinter root window isn't quite the right sizetkinter 根窗口的大小不太合适
【发布时间】:2013-08-18 21:26:48
【问题描述】:

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

【问题讨论】:

    标签: python python-2.7 tkinter tkinter-canvas


    【解决方案1】:

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

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

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

    self.root.wait_visibility(self.root)
    

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

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

    【讨论】:

    • 为什么根窗口还不存在,我正在调用它,并使用它。
    • 添加了更多解释 - 这是否清楚?如果你想改变你注意到的行为,我也给了你一个修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    相关资源
    最近更新 更多