Python tkinter中可调整大小的窗口框架
我用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()
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,显示如何创建顶级窗口。在代码中的位置由您决定,但可能应该以易于维护和理解的方式进行组织。