[英]Resize entry box in tkinter
以下 MWE 適用於具有水平和垂直滾動條的窗口。 該窗口包含一個顯示當前工作目錄的輸入框。 但是由於輸入框太小,無法全部看到輸入框內的文字。 當用戶放大窗口時,我希望能夠顯示更多的文本。 如何調整以下示例,以便輸入框(在 UserFileInput 中定義)隨窗口大小調整? 我曾嘗試使用window.grid_columnconfigure
(見下文),但這沒有任何效果。 使用畫布似乎是一個問題,因為以前我能夠調整條目框的大小,但是我需要畫布才能將水平和垂直滾動條放置在窗口上。
window.grid(row=0, column=0, sticky='ew')
window.grid_columnconfigure(0, weight=1)
(還有列 = 1),但這沒有效果。
import Tkinter as tk
import tkFileDialog
import os
class AutoScrollbar(tk.Scrollbar):
def set(self, lo, hi):
if float(lo) <= 0.0 and float(hi) >= 1.0:
# grid_remove is currently missing from Tkinter!
self.tk.call("grid", "remove", self)
else:
self.grid()
tk.Scrollbar.set(self, lo, hi)
class Window(tk.Frame):
def UserFileInput(self,status,name):
row = self.row
optionLabel = tk.Label(self)
optionLabel.grid(row=row, column=0, sticky='w')
optionLabel["text"] = name
text = status#str(dirname) if dirname else status
var = tk.StringVar(root)
var.set(text)
w = tk.Entry(self, textvariable= var)
w.grid(row=row, column=1, sticky='ew')
w.grid_columnconfigure(1,weight=1)
self.row += 1
return w, var
def __init__(self,parent):
tk.Frame.__init__(self,parent)
self.row = 0
currentDirectory = os.getcwd()
directory,var = self.UserFileInput(currentDirectory, "Directory")
if __name__ == "__main__":
root = tk.Tk()
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0,weight=1)
vscrollbar = AutoScrollbar(root,orient=tk.VERTICAL)
vscrollbar.grid(row=0, column=1, sticky='ns')
hscrollbar = AutoScrollbar(root, orient=tk.HORIZONTAL)
hscrollbar.grid(row=1, column=0, sticky='ew')
canvas=tk.Canvas(root,yscrollcommand=vscrollbar.set,xscrollcommand=hscrollbar.set)
canvas.grid(row=0, column=0, sticky='nsew')
vscrollbar.config(command=canvas.yview)
hscrollbar.config(command=canvas.xview)
window = Window(canvas)
canvas.create_window(0, 0, anchor=tk.NW, window=window)
window.update_idletasks()
canvas.config(scrollregion=canvas.bbox("all"))
root.mainloop()
您的代碼中有幾個問題阻礙了您的工作。 最大的障礙是您將框架放入畫布中。 這很少有必要,它會使您的代碼比它需要的更復雜嗎? 您是否有理由使用畫布,是否有理由將類用於部分代碼而不是所有代碼?
無論如何,你有兩個問題:
grid_columnconfigure
不正確。在嘗試解決布局問題時,一個非常有用的技術是暫時為每個包含的小部件指定唯一的顏色,以便您可以看到每個小部件的位置。 例如,將畫布塗成粉紅色,將Window
框架塗成藍色,可以清楚地表明Window
框架也沒有調整大小。
因為您選擇將小部件嵌入畫布中,所以當包含的畫布更改大小時,您將不得不手動調整框架的寬度。 您可以通過在畫布上設置綁定以在調整大小時調用函數來實現。 您為此使用的事件是<Configure>
。 注意:configure 綁定觸發的不僅僅是大小更改,但您可以放心地忽略該事實。
該函數需要計算畫布的寬度,以及所需的框架寬度(減去您想要的任何填充)。 然后,您需要將框架配置為具有該寬度。 為方便起見,您需要保留對框架的畫布 id 的引用,或者為框架提供唯一標簽。
這是一個假設框架具有標簽“框架”的函數:
def on_canvas_resize(event):
padding = 8
width = canvas.winfo_width() - padding
canvas.itemconfigure("frame", width=width)
您需要調整創建畫布項目的方式以包含標簽:
canvas.create_window(..., tags=["frame"])
最后,設置綁定以在小部件更改大小時觸發:
canvas.bind("<Configure>", on_canvas_resize)
您需要在包含的小部件上使用grid_columnconfigure
。 您希望框架內的列增長和收縮,而不是標簽內的列。
您需要更改此行:
w.grid_columnconfigure(...)
對此:
self.grid_columnconfigure(...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.