初始化后如何通过鼠标拖动更改 tkinter 小部件的高度(或宽度)?
How to change the height (or width) of tkinter widget with mouse drag, after initialization?
我发现最接近的方法是打包分隔的小部件 ttk.Separator 更改光标并触发一个函数,当鼠标开始在分隔符上单击时调整顶部和底部小部件的大小。问题是,由于我遇到的故障,它无法正常工作,而且我找不到原因。请检查以下代码:
import tkinter as tk
from tkinter import ttk
from ttkwidgets.autocomplete import AutocompleteEntryListbox
def resize(event):
searchbox.config(height=searchbox.winfo_height()+event.y)
template.config(height=template.winfo_height()-event.y)
window = tk.Tk()
frame_navigator = tk.Frame(window)
frame_navigator.configure(background="white",width=300,height=300)
frame_navigator.pack_propagate(0)
searchbox = AutocompleteEntryListbox(frame_navigator,completevalues=[],allow_other_values=False)
searchbox.pack(side=tk.TOP,expand=1,fill=tk.BOTH)
separator = ttk.Separator(frame_navigator,orient='horizontal',cursor="size_ns")
separator.bind("<B1-Motion>",resize)
separator.pack(side=tk.TOP,fill=tk.X)
template = tk.Listbox(frame_navigator,exportselection=False)
template.pack(side=tk.TOP,expand=1,fill=tk.BOTH)
frame_navigator.pack(side=tk.TOP,expand=1,fill=tk.BOTH)
我们将不胜感激!
我没有安装 ttkwidgets,但我用 tk.Listbox
替换了 AutocompleteEntryListbox
进行测试,并找到了一个使用 tk.PanedWindow
的解决方案,这是一个专门为此设计的小部件。没有理由它不应该与不同的小部件一起使用。将 PanedWindow 的 orient
设置为 tkinter.constants.VERTICAL
以更改高度,并使用 frame_navigator.add() 而不是 widget.pack() 使其工作。完成代码:
import tkinter as tk
from tkinter.constants import *
window = tk.Tk()
frame_navigator = tk.PanedWindow(window, orient=VERTICAL)
frame_navigator.configure(background="white", width=300, height=300)
frame_navigator.pack_propagate(0)
searchbox = tk.Listbox(frame_navigator)
frame_navigator.add(searchbox)
template = tk.Listbox(frame_navigator, exportselection=False)
frame_navigator.add(template)
frame_navigator.pack(side=tk.TOP, expand=1, fill=tk.BOTH)
window.mainloop()
我发现最接近的方法是打包分隔的小部件 ttk.Separator 更改光标并触发一个函数,当鼠标开始在分隔符上单击时调整顶部和底部小部件的大小。问题是,由于我遇到的故障,它无法正常工作,而且我找不到原因。请检查以下代码:
import tkinter as tk
from tkinter import ttk
from ttkwidgets.autocomplete import AutocompleteEntryListbox
def resize(event):
searchbox.config(height=searchbox.winfo_height()+event.y)
template.config(height=template.winfo_height()-event.y)
window = tk.Tk()
frame_navigator = tk.Frame(window)
frame_navigator.configure(background="white",width=300,height=300)
frame_navigator.pack_propagate(0)
searchbox = AutocompleteEntryListbox(frame_navigator,completevalues=[],allow_other_values=False)
searchbox.pack(side=tk.TOP,expand=1,fill=tk.BOTH)
separator = ttk.Separator(frame_navigator,orient='horizontal',cursor="size_ns")
separator.bind("<B1-Motion>",resize)
separator.pack(side=tk.TOP,fill=tk.X)
template = tk.Listbox(frame_navigator,exportselection=False)
template.pack(side=tk.TOP,expand=1,fill=tk.BOTH)
frame_navigator.pack(side=tk.TOP,expand=1,fill=tk.BOTH)
我们将不胜感激!
我没有安装 ttkwidgets,但我用 tk.Listbox
替换了 AutocompleteEntryListbox
进行测试,并找到了一个使用 tk.PanedWindow
的解决方案,这是一个专门为此设计的小部件。没有理由它不应该与不同的小部件一起使用。将 PanedWindow 的 orient
设置为 tkinter.constants.VERTICAL
以更改高度,并使用 frame_navigator.add() 而不是 widget.pack() 使其工作。完成代码:
import tkinter as tk
from tkinter.constants import *
window = tk.Tk()
frame_navigator = tk.PanedWindow(window, orient=VERTICAL)
frame_navigator.configure(background="white", width=300, height=300)
frame_navigator.pack_propagate(0)
searchbox = tk.Listbox(frame_navigator)
frame_navigator.add(searchbox)
template = tk.Listbox(frame_navigator, exportselection=False)
frame_navigator.add(template)
frame_navigator.pack(side=tk.TOP, expand=1, fill=tk.BOTH)
window.mainloop()