为什么tkinter不识别窗口正在调整大小?

2 投票
2 回答
4285 浏览
提问于 2025-04-17 17:05

我在用tkinter检测窗口大小变化的时候,大部分情况下都能正常工作。不过,有一个例外,就是当我第一次垂直调整窗口大小并且把窗口变大的时候,系统没有反应。我能看到窗口最开始的大小,但如果我立刻把窗口往垂直方向变大,就没有任何反应。不过,如果我先把窗口调整成其他方向(比如变小或者水平调整),然后再往垂直方向“变高”,那就没问题了。

这是我用的代码的主要部分:

from Tkinter import *
main = Tk()
def resize(event):
    print("The new dimensions are:",event.width,"x",event.height)
    window.focus_set()
canvas = Canvas(main, width=850, height=400)
window = Frame(main, width=800, height=10)
window.focus_set()
canvas.bind("<Configure>", resize)
canvas.pack()
canvas.update()
window.pack()
main.mainloop()

我是不是哪里做错了?如果有关系的话,我是在64位的Ubuntu 12.10上使用Python 2.7.3。

补充:似乎当窗口的大小超过852x402时,尺寸要么不对(水平变大),要么根本不显示(垂直变大)。这是不是我窗口管理器(比如Unity)的问题?

2 个回答

2

这是因为画布没有被调整大小。你虽然给画布设置了绑定,但并没有让画布随着窗口的大小变化而变化。

你可以试着给画布和框架的背景设置一个明显的颜色,这样你就能明白我说的意思了。

要解决这个问题,可以在放置你的组件时设置 expandfill 属性。

2

把这行代码 canvas = Canvas(main, width=850, height=400) 改成 canvas = Canvas(main, width=850, height=400, bg="red"),然后看看会发生什么。

因为这个画布是在主窗口里面的,当你把窗口垂直拉大时,画布的大小和位置并没有改变。它的最大高度保持在400,所以不会触发任何事件。但是如果你把窗口横向拉大,画布的位置会正好在中间,这是因为调用了 pack() 这个方法:所以它会移动,并且会触发相关的函数。

当你把窗口横向和纵向都缩小时,其他的结果都是可以预料的。

撰写回答