簡體   English   中英

在 tkinter 中調整輸入框的大小

[英]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()

您的代碼中有幾個問題阻礙了您的工作。 最大的障礙是您將框架放入畫布中。 這很少有必要,它會使您的代碼比它需要的更復雜嗎? 您是否有理由使用畫布,是否有理由將類用於部分代碼而不是所有代碼?

無論如何,你有兩個問題:

  1. 當窗口增長時框架沒有增長,所以窗口內的內容不能增長
  2. 標簽不會增長,因為您使用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 獲取要調整大小的標簽

您需要在包含的小部件上使用grid_columnconfigure 您希望框架內的列增長和收縮,而不是標簽內的列。

您需要更改此行:

w.grid_columnconfigure(...)

對此:

self.grid_columnconfigure(...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM