Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter中可调整大小的窗口框架_Python_Python 3.x_Tkinter - Fatal编程技术网

Python tkinter中可调整大小的窗口框架

Python tkinter中可调整大小的窗口框架,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我用tkinter为我的程序创建了一个窗口,但我希望它在用户调整窗口大小时自动调整大小。现在,当我增大或减小窗口的大小时,窗口小部件保持在相同的位置,并且不会减小大小 这是我的密码: import tkinter as tk class Graphicaluserinterface(tk.Frame): def __init__(self,master=None): super().__init__(master) self.grid()

我用tkinter为我的程序创建了一个窗口,但我希望它在用户调整窗口大小时自动调整大小。现在,当我增大或减小窗口的大小时,窗口小部件保持在相同的位置,并且不会减小大小

这是我的密码:

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

您需要配置网格行和列的权重。下面是您的代码的重构版本,它应该像您所希望的那样发挥更大的作用。请从此代码继续开发:

#! /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()

我认为这些问题应该会有所帮助。当我使用链接中提供的信息时,我的窗口现在可以调整大小,但所有小部件都位于不同的位置。我认为这是因为在网格化小部件时需要更改粘性选项。如果你想让一个小部件随窗口调整大小,你需要使用widget.grid..,sticky='ewns'非常感谢这个答案,它正按照我的要求工作。但有两个问题:1。输入路径显示从代码的哪一部分垂直增加?2.将这些小部件放在init方法中,并将这些小部件的网格方法放在ccreate_小部件方法中的原因是什么?我如何实现顶级窗口?在我将它们定义为:tkinter.Toplevelroot之前,但这不起作用now@James1参见第14、15、44和46行。2 PyCharm抱怨说,新的实例变量是在_init__;之外定义的。这个问题至少有两种解决方案。首先,您可以将它们全部设置为“无”,然后稍后重新分配它们;第二,你可以把所有的赋值都放在初始值设定项中。我建议您将create_widgets重命名为更合适的名称,如place_widgets或grid_widgets。好的,谢谢您提供的所有信息,我将尝试添加更多的复选按钮。顺便说一句,我不确定这是我的jupyter笔记本还是我的电脑,但每次我在菜单栏中按“退出”按钮时,您都会输入命令self.tk.quit my program冻结,内核需要重新启动。@James您的第二条评论,请参阅我的编辑。添加了一个staticmethod,显示如何创建顶级窗口。在代码中的位置由您决定,但可能应该以易于维护和理解的方式进行组织。