Как сделать так, чтобы текстовое поле расширялось, если мы растягиваем окно с помощью Tkinter? - PullRequest
0 голосов
/ 03 июня 2019

Я хочу, чтобы, когда я растягивал окно, текстовое поле внутри него также увеличивалось.Я следил за видео-сериалом на youtube от sentdex, поэтому мой код чем-то похож на его.

Я пытался сделать его липким, я пытался поставить вес на столбцы и строки, но он не изменился.

Код:

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 голосов
/ 04 июня 2019

Первое, что вам нужно сделать для отладки, это временно придать вашим рамкам отличительные цвета. Это позволяет легко увидеть, какие из нескольких вложенных фреймов растут, а какие нет. Иногда также полезно добавить дополнительные отступы, чтобы вы могли видеть внутренние края фреймов, но в этом случае это не обязательно.

Итак, начнем с придания цвета различным кадрам:

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_columnconfigure на кадре, в котором находится containerinput. В этом случае этот кадр 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_columnconfigure на containerinput, поскольку вы также размещаете виджеты внутри этого фрейма с помощью grid.

0 голосов
/ 03 июня 2019

Вы можете связать '', чтобы перехватить все размеры окна.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...