[英]tkinter: scrollbar autohide without window resize
使用我寫的以下示例代碼,我在某些行為上遇到了問題。 我想根據需要添加/刪除滾動條。 但是,當我這樣做時,它會隨着窗口大小的變化而移動窗口中的所有其他元素。 這只是一個演示問題的示例,添加和刪除滾動條時,您將看到窗口調整大小。 在實際的應用程序中,窗口上有更多小部件。
我是否要嘗試以正確的方式執行此操作,否則,如何解決該問題? 我還計划在另一個單獨的框架中使用第二個帶有滾動條的小部件。
from tkinter import *
from tkinter import ttk
class TopFrame(ttk.Frame):
def __init__(self, parent, col=0, row=0):
ttk.Frame.__init__(self, parent)
self.innerframe = ttk.Frame(parent)
self.list_scroll = ttk.Scrollbar(self.innerframe)
self.list_scroll.grid(column=1, row=0, sticky=NS)
self.list_scroll.grid_remove()
self.list = Listbox(self.innerframe, width=64, height=8,
yscrollcommand=self.list_scroll.set)
self.list_scroll.config(command=self.list.yview)
self.list.grid(column=0, row=0, sticky=NSEW)
self.innerframe.grid(column=col, row=row)
self.addbtn = ttk.Button(parent, text='add item',
command=self.additem)
self.addbtn.grid(column=col, row=row+1, padx=10, pady=2)
self.delbtn = ttk.Button(parent, text='del item',
command=self.delitem)
self.delbtn.grid(column=col, row=row+2, padx=10, pady=2)
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
def additem(self):
count = str(len(self.list.get(0, END)))
self.list.insert(END, 'demo' + count)
if len(self.list.get(0, END)) > 8:
self.list_scroll.grid()
def delitem(self):
self.list.delete(END)
if len(self.list.get(0, END)) <= 8:
self.list_scroll.grid_remove()
class MasterFrame(Tk):
def __init__(self):
Tk.__init__(self)
topframe = TopFrame(self)
if __name__ == '__main__':
MasterFrame().mainloop()
第一次顯示窗口后,您可以獲取窗口大小,然后使用該大小在根窗口上調用geometry
方法。 當您使用geometry
命令設置窗口的大小時,它將基於其內部小部件的更改而停止調整大小。
最簡單的事情是編寫一個函數來執行此操作,並安排它與after_idle
一起運行,該after_idle
應在首次顯示窗口后觸發。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.