如果我们用Tkinter拉伸窗口,如何使文本框扩展?

时间:2019-06-03 16:06:43

标签: python python-3.x tkinter

我希望当我拉伸窗口时,其中的文本框也会变大。 我一直在关注senddex的youtube视频系列,所以我的代码与他的相似。

我尝试将其设置为粘性,我尝试对列和行施加权重,但它不会改变。

代码:

import tkinter as tk

from tkinter import filedialog

class OpenFile(tk.Tk):

    def __init__(self,*args,**kwargs):

        tk.Tk.__init__(self,*args,**kwargs)

        tk.Tk.wm_title(self,"FileOpener")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0,weight=1)
        container.grid_columnconfigure(0, weight=1)


        menubar = tk.Menu(container)
        filemenu = tk.Menu(menubar, tearoff=0)
        filemenu.add_command(label="Save settings", 
                                    command= lambda:print("Doing nothing"))
        filemenu.add_separator()
        filemenu.add_command(label="Exit", command=quit)
        menubar.add_cascade(label="File", menu=filemenu)

        tk.Tk.config(self,menu=menubar)

        self.frames = {}

        for F in (StartPage,):

            frame =F(container, self)
            self.frames[F] = frame
            frame.grid( row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def show_frame(self,cont):

        frame = self.frames[cont]
        frame.tkraise()

class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        global filetextbox
        ### INPUT FRAME
        containerinput=tk.Frame(self)
        containerinput.grid(row=2,column=0,columnspan=4,sticky="nsew")
        containerinput.grid_columnconfigure(0, weight=1)
        containerinput.grid_rowconfigure(1, weight=1)
        ## Label
        labeltxt1 = tk.Text(self)
        labeltxt1.config(height=1,relief=tk.SUNKEN)
        #label1.pack(pady=10,padx=10,side=tk.LEFT)
        labeltxt1.grid(row=1,column=0)

        ## Text
        text1 = tk.Text(containerinput)
        text1.pack(side=tk.LEFT,fill="both",expand=True)
        scroll1= tk.Scrollbar(containerinput,command=text1.yview)
        scroll1.pack(side=tk.RIGHT,fill=tk.BOTH)
        text1.config(yscrollcommand=scroll1.set)       

        #containerinput.pack(side=tk.LEFT,fill="both",expand=True)
        ##Button
        button1 = tk.Button(self, text="Choose file", 
                                command=lambda:getFile(self))
        #button1.pack(side=tk.TOP)
        button1.grid(row=0,column=0)

app=OpenFile()

app.mainloop()

这是它的样子:

enter image description here

这是我想要的类型:

enter image description here

2 个答案:

答案 0 :(得分:0)

您首先需要调试的方法是暂时为框架提供独特的颜色。这样可以很容易地看到几个嵌套框架中的哪些正在增长,哪些没有。有时添加额外的填充也很有帮助,这样您可以看到框架的内部边缘,但是在这种情况下不是必须的。

因此,首先为不同的帧添加颜色:

class OpenFile(tk.Tk):
    def __init__(self,*args,**kwargs):
        ...
        container = tk.Frame(self, background="pink")

class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent, background="blue")
        ...
        containerinput=tk.Frame(self, background="yellow")

执行此操作后,很明显,蓝色框正在根据需要扩展,但是其中的黄色框没有扩展。

原因是您将黄色框(containerinput)放在了StartPage框内,但没有配置它来调整大小。由于您是使用grid添加的,因此您需要告诉tkinter哪些行和列应该获得任何额外的未使用空间。您可以在放置grid_rowconfigure的帧上使用grid_columnconfigurecontainerinput进行此操作。在这种情况下,该帧为self

containerinput=tk.Frame(self, background="yellow")
containerinput.grid(row=2,column=0,columnspan=4,sticky="nsew")
...
self.grid_rowconfigure(2, weight=1)
self.grid_columnconfigure(0, weight=1)

注意:您仍然需要在grid_rowconfigure上调用grid_columnconfigurecontainerinput,因为您还需要使用grid将小部件放置在该框架中。

答案 1 :(得分:-1)

您可以绑定''以捕获所有窗口调整大小。

class StartPage(tk.Frame):
  def __init__(self)
    self.bind("<Configure>", self.update_size)
    ...

  def update_size(self, event):
    print(event.width, event.height) #this has all the information about the window resize

来源:http://effbot.org/zone/tkinter-window-size.htm