Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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 为什么赢了';t我的tkinter小部件使用粘性和列/行权重进行拉伸_Python_User Interface_Tkinter - Fatal编程技术网

Python 为什么赢了';t我的tkinter小部件使用粘性和列/行权重进行拉伸

Python 为什么赢了';t我的tkinter小部件使用粘性和列/行权重进行拉伸,python,user-interface,tkinter,Python,User Interface,Tkinter,我正在Tkinter中创建GUI。我已经一次又一次地尝试让我的小部件在GUI中得到扩展。我正在使用粘性命令和列/行权重。在“设计查看器”选项卡上,我希望列表框与窗口垂直拉伸,我希望带有蓝色框的画布垂直和水平拉伸。我添加了一张图片,以澄清我预期会发生什么 提前谢谢!这是我的密码: # Gui import tkinter as tk from tkinter import N,W,S,E from tkinter import messagebox class Application(

我正在Tkinter中创建GUI。我已经一次又一次地尝试让我的小部件在GUI中得到扩展。我正在使用粘性命令和列/行权重。在“设计查看器”选项卡上,我希望列表框与窗口垂直拉伸,我希望带有蓝色框的画布垂直和水平拉伸。我添加了一张图片,以澄清我预期会发生什么

提前谢谢!这是我的密码:

    # Gui 
import tkinter as tk
from tkinter import N,W,S,E
from tkinter import messagebox
class Application(tk.Frame):

    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.grid(sticky = N+E+S+W)
        self.create_application_foundation()

    def create_application_foundation(self):
        # Create menubar ribbon

        self.topRibbon = tk.Frame(self, bg = "#E3E5E6")
        self.topRibbon.grid(row=0, column=0, sticky=W+E+N+S)


        # Initialize Buttons
        width = 15; height = 2; bg = "#F5F6F7"; relief = "flat"; bd = 0; padx = 1
        self.designViewerButton = tk.Button(self.topRibbon, text = "Design\nViewer", width = width,
                                         height = height, bg = bg, relief = relief, bd = bd)
        self.patternCreatorButton = tk.Button(self.topRibbon, text = "Pattern\nCreator",width = width,
                                                height = height, bg = bg, relief = relief, bd = bd)

        # Add buttons to ribbon
        self.designViewerButton.grid(row = 1, column = 0, padx = padx, sticky = N+W)
        self.patternCreatorButton.grid(row = 1, column = 1, padx = padx, sticky = N+W)

        # Create design viewer window
        self.createdesignViewerWindow()
        self.createObjectCreator()

        # Try to make things expandable
        self.topRibbon.grid_rowconfigure(1, weight=1)
        self.topRibbon.grid_columnconfigure(1, weight=1)

    def createdesignViewerWindow(self):
        width = 30; height = 1; bg = "#F5F6F7"; relief = "flat"; bd = 0; pady = 1

        # Create window
        self.designViewerWindow = tk.Frame(self, bg = "#E3E5E6")
        self.designViewerWindow.grid(row=1, column=0, sticky =W+E+N+S)

        # Create object button
        self.objectButton = tk.Button(self.designViewerWindow, text = "Object", width = width,
                                            height = height, bg = bg, relief = relief, bd = bd)
        self.objectButton.grid(row = 0, sticky =N+W, pady = pady)

        # Create object listbox
        self.objectListBox = tk.Listbox(self.designViewerWindow)        
        objects = ["Object {}".format(i) for i in range(50)]
        self.objectListBoxFrame = tk.Frame(self.designViewerWindow)
        self.objectsListBox = tk.Canvas(self.objectListBoxFrame, width=100, height=200)
        self.objectsListBox.grid(row = 0, rowspan = 5,column = 0, sticky = N+S)
        self.objectListBoxFrame.grid(row = 1, sticky = N+S, pady = pady)

        # Create canvas with blue rectangle
        self.imageCanvas = tk.Canvas(self.designViewerWindow, width=200, height=100)
        self.imageCanvas.grid(row = 0, rowspan = 5,column = 1, columnspan = 5, sticky = N+E+S+W)
        self.imageCanvas.create_rectangle(50, 25, 150, 75, fill="blue")
        self.imageCanvas.config(bg = "white")

        # Attempt to make window expandable        
        self.designViewerWindow.rowconfigure(1,weight = 1)
        self.designViewerWindow.columnconfigure(1, weight=1)

    def createObjectCreator(self):
        self.objectCreatorWindow = tk.Frame(self,bg = "#E3E5E6")
        self.tempLabel = tk.Label(self.objectCreatorWindow, text = "Object Creator").grid()

if __name__ == "__main__":
    import sys
    root = tk.Tk()
    root.title("My Program")
    root.grid_rowconfigure(1, weight=1)
    root.grid_columnconfigure(1, weight=1)

    # root.minsize(400,200)
    app = Application(master=root)
    app.mainloop()

问题的第一部分是,您尚未将应用程序配置为填充窗口,因此应用程序中的任何内容都不会填充窗口

您似乎试图这样做,但您将根窗口中的所有权重赋予了第1行和第1列,但您将
app
放入了第0行和第0列。您需要为行和列0指定权重:

root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
注意:如果一个容器中只有一个小部件,那么使用pack就更容易了,因为您可以将它配置为仅用一行代码而不是三行代码填充窗口

例如:

self.pack(fill="both", expand=True)
。。。对

self.grid(sticky = N+E+S+W)
root.grid_rowconfigure(1, weight=1)
root.grid_columnconfigure(0, weight=1)
下一个问题是,您正在使用
网格将小部件放入
应用程序
框架中,但是您没有为
应用程序
框架中的任何行或列赋予权重。所以再一次,这个框架不会填充它的父框架,所以里面的任何小部件也不会填充窗口

我认为您希望第0列获得所有额外空间,但希望第1行成为获得额外空间的行,因为
self.designViewerWindow
就是这样

将以下内容添加到
应用程序的
\uuuu init\uuuu
中:

class Application(tk.Frame):
    def __init__(self, master=None):
        ...
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(0, weight=1)
        ...
还有其他问题,但这表明了一个普遍的问题:您没有正确配置每组小部件的行和列。根据经验,对于每个由
grid
管理子部件的小部件,您需要为至少一行和一列赋予正权重


如果您为同一小部件的子部件将对
grid
的所有调用组合在一起,然后在同一位置添加
rowconfigure
columnconfigure
命令,那么这一切都会更容易看到。这样,您可以轻松地一眼就看到每个组的所有网格选项。

这是太多的代码了。你能试着把它降到最低吗?例如,我们不需要任何菜单栏代码或任何函数。只要给我们展示小部件的代码,以及足够的额外代码就可以了。给我几分钟我已经把代码缩减到几个按钮和框。