简体   繁体   中英

resizable window frame in tkinter

I created a window with tkinter for my programm but I want it to resize itself when the user resizes the window. Right now when I increase or decrease the size of the window the widgets stay at the same position and don't in-/decrease in size.

Here is my code:

import tkinter as tk

class Graphicaluserinterface(tk.Frame):


    def __init__(self,master=None):
        super().__init__(master)
        self.grid()
        self.check1 = tk.IntVar()
        self.fileopenname1 = tk.StringVar()
        self.entrystring = tk.IntVar()
        self.menubar = tk.Menu(self)
        self.create_widgets()

    def create_widgets(self):
        self.filemenu=tk.Menu(self.menubar,tearoff=0)
        self.menubar.add_cascade(label="File",menu=self.filemenu)
        self.filemenu.add_command(label="Exit",command = root.destroy)
        self.helpmenu=tk.Menu(self.menubar,tearoff=0)

        self.programmstart = tk.Button(self, text = "Start Program")
        self.programmstart.grid(row=10,column=8,sticky = "W")

        self.checkbutton1 = tk.Checkbutton(self, text = "Drehzahl und Drehmoment",variable=self.check1,onvalue=1,offvalue=0)
        self.checkbutton1.grid(row=0,column=0,columnspan=3,sticky = "W")

        self.leer1 = tk.Label(self,text="                               ") #erzeugt leere Zelle, sonst ist startbutton links
        self.leer1.grid(row=0,column=3,columnspan=5)
        self.leer2 = tk.Label(self,text="                               ")
        self.leer2.grid(row=5,column=8,rowspan=2)
        self.leer3 = tk.Label(self,text="                               ")
        self.leer3.grid(row=9,column=9)

        self.inputpathdisplay = tk.Label(self,textvariable=self.fileopenname1,bg="white",width=60)
        self.inputpathdisplay.grid(row=1,column=8,columnspan=3,sticky = "W")
        self.inputpathdisplaylabel = tk.Label(self,text="Inputfile")
        self.inputpathdisplaylabel.grid(row=0,column=8,columnspan=3)


root = tk.Tk()
app = Graphicaluserinterface(master=root)
app.master.title("Programm")
app.master.minsize(800,300)
root.config(menu=app.menubar)
app.mainloop()

You need to configure the weight on your grid's rows and columns. The following is a refactored version of your code that should act a little more as you were hoping. Please continue development from this code:

#! /usr/bin/env python3
import tkinter
from tkinter.constants import *


class GraphicalUserInterface(tkinter.Frame):

    @classmethod
    def main(cls):
        root = tkinter.Tk()
        root.title('Program')
        root.minsize(560, 105)
        gui = cls(root)
        gui.grid(row=0, column=0, sticky=NSEW)
        root.grid_rowconfigure(0, weight=1)
        root.grid_columnconfigure(0, weight=1)
        root['menu'] = gui.menubar
        cls.create_toplevel(root, 'First Toplevel')
        root.mainloop()

    @staticmethod
    def create_toplevel(root, window_title):
        window = tkinter.Toplevel(root)
        window.title(window_title)
        window.minsize(560, 105)

    def __init__(self, master=None):
        super().__init__(master)
        self.check_value = tkinter.BooleanVar()
        self.filename = tkinter.StringVar()
        self.menubar = tkinter.Menu(self)
        self.file_menu = tkinter.Menu(self.menubar, tearoff=FALSE)
        self.help_menu = tkinter.Menu(self.menubar, tearoff=FALSE)
        self.program_start = tkinter.Button(
            self, text='Start Program',
            command=lambda: self.create_toplevel(self.master, 'Another Window')
        )
        self.check_button = tkinter.Checkbutton(
            self, text='Speed ​​& Torque', variable=self.check_value,
            onvalue=True, offvalue=False
        )
        self.input_path_display = tkinter.Label(
            self, textvariable=self.filename, bg='white', width=60
        )
        self.input_path_display_label = tkinter.Label(self, text='Input File')
        self.create_widgets()

    def create_widgets(self):
        self.menubar.add_cascade(label='File', menu=self.file_menu)
        self.file_menu.add_command(label='Exit', command=self.master.destroy)
        pad = dict(padx=5, pady=5)
        self.check_button.grid(row=0, column=0, **pad)
        self.input_path_display_label.grid(row=0, column=1, sticky=EW, **pad)
        self.input_path_display.grid(row=1, column=1, sticky=NSEW, **pad)
        self.program_start.grid(row=2, column=1, sticky=EW, **pad)
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(1, weight=1)


if __name__ == '__main__':
    GraphicalUserInterface.main()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM