首页 文章

调整tkinter中的输入框大小

提问于
浏览
0

以下MWE用于具有水平和垂直滚动条的窗口 . 该窗口包含一个输入框,其中显示当前工作目录 . 但是,输入框中的文字不能全部被视为框太小 . 我希望能够在用户放大窗口时显示更多此文本 . 如何调整以下示例,以便使用窗口调整Entry框(在UserFileInput中定义)的大小?我尝试过使用 window.grid_columnconfigure (见下文),但这没有任何效果 . 这似乎是使用画布的一个问题,因为之前我能够让Entry框调整大小,但是我需要画布才能将水平和垂直滚动条放在窗口上 .

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 回答

  • 1

    您的代码中有几个问题阻碍了您 . 最大的障碍是你把一个框架放在画布里面 . 这很少是必要的,它使你的代码比它需要的更复杂?您是否有使用画布的原因,是否有理由为部分代码使用类而不是所有内容?

    无论如何,你有两个问题:

    • 框架没有't growing when the window grows, so the contents inside the window can'增长

    • 标签赢了't grow because you'重新使用 grid_columnconfigure 错误 .

    用于可视化问题的提示

    在尝试解决布局问题时,一种非常有用的技术是暂时为每个包含窗口小部件提供唯一的颜色,以便您可以看到每个窗口小部件的位置 . 例如,将画布粉红色和 Window 框架蓝色着色将清楚地表明 Window 框架也没有调整大小 .

    调整框架大小

    因为您选择将窗口小部件嵌入到画布中,所以当包含的画布更改大小时,您将不得不手动调整框架的宽度 . 您可以通过在画布上设置绑定来调整函数,只要它调整大小 . 您用于此的事件是 <Configure> . 注意:配置绑定的触发不仅仅是大小更改,但您可以放心地忽略这一事实 .

    该函数需要计算画布的宽度,从而计算所需的帧宽度(减去所需的任何填充) . 然后,您需要将帧配置为具有该宽度 . 为方便起见,您需要保留对框架画布ID的引用,或者为框架指定唯一标记 .

    这是一个假设框架具有标签“frame”的函数:

    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(...)
    

相关问题