tkinter.tk.Sizegrip中的异常行为
我现在正在学习Python 3中的tkinter,所以我不确定我遇到的是bug还是我操作不当。
from tkinter import *
from tkinter import ttk
root = Tk()
grip = ttk.Sizegrip(root).grid(column=0, row=0, sticky=(S,E))
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
root.mainloop()
当我抓住大小调整控件时,整个窗口会迅速移动(比我的鼠标指针移动得还快)到屏幕底部。虽然窗口的大小调整是正常的,但整个窗口的移动速度让我感到意外。[我使用的是Ubuntu 10.04和Python 3.1.2]
1 个回答
1
我在我的系统上也遇到了同样的问题(Ubuntu 10.10,Python 2.6),我觉得这和窗口管理器有关,而不是Tkinter。当我使用Openbox时,就没有这个问题;而且当我使用root.overrideredirect(1)时,也没有这个问题。
你可以做一个ttk.Label,让它看起来像一个大小调整控件。然后把它绑定到窗口上,这样就可以根据它来调整窗口的大小。下面是用这种方式制作的一个窗口:
from tkinter import *
from tkinter import ttk
#
# Callbacks:
#
# Change "bottom_right_corner" to "size_nw_se" and
# "arrow" to "left_ptr" if running on Windows.
#
def button_press(event):
sizegrip["cursor"] = "bottom_right_corner"
def resize(event):
deltax = event.x_root - root.winfo_rootx()
deltay = event.y_root - root.winfo_rooty()
if deltax < 1:
deltax = 1
if deltay < 1:
deltay = 1
root.geometry("%sx%s" % (deltax, deltay))
def button_release(event):
sizegrip["cursor"] = "arrow"
# Widget Creation
root = Tk()
sizegrip = ttk.Label(root, style="Sizer.TLabel")
# Styling
style = ttk.Style()
style.layout("Sizer.TLabel", [("Sizegrip.sizegrip",
{"side": "bottom", "sticky": "se"})])
# Geometry Management
sizegrip.pack(side="bottom", anchor="se")
# Bindings
sizegrip.bind("<ButtonPress-1>", button_press)
sizegrip.bind("<B1-Motion>", resize)
sizegrip.bind("<ButtonRelease-1>", button_release)
root.mainloop()
我习惯用Python 2,所以如果我在语法上搞错了,请见谅。我用Python 2的导入方式测试过(“from Tkinter import *”和“import ttk”),它是可以工作的。希望在Python 3中,导入的部分就是唯一的不同。