首页 > 解决方案 > 定向和组织 Tkinter 帧

问题描述

我想知道如何创建与我指定的网格和填充空间对齐的框架。我很难掌握窗口内的框架方向。我可以制作所有的框架,但如果我打包,它们都在左边或在一条线上/在右边。我玩了这个并决定使用grid()。我设置了窗口几何形状,然后使用网格作为框架。但是,我的框架全部折叠到左上角,或者我的初始框架填满了整个空间,而另外两个则挤在边缘。我尝试使用 1024 和 768 的窗口几何形状,然后将我的第一帧的宽度和高度分配为 512 和 384。然后将接下来的两个设置为宽度为 512 和高度为 192。我还在其他文章中看到重量很重要,并且尝试了代码迭代来改变它,但没有成功。

无论如何,代码如下:

class twinsplay:
    
    def __init__(self):
        #Window
        self.window =  Tk()
        self.window.geometry('1024x768')
        self.window.grid_rowconfigure(1, weight=1)
        self.window.grid_columnconfigure(1, weight=1)
        
        #window title
        self.window.title('Live Feed')
        
        #frames and labels
        self.frame_left = Frame(self.window, background='magenta')
        self.frame_left.grid(row=0, column=0, padx=5, pady=5, rowspan=3, columnspan=3, sticky=NSEW)
        self.label_left = Label(self.frame_left, text = 'Weather Data', justify=LEFT)
        self.label_left.grid(row=0,column=0, sticky=NSEW)
        
        self.frame_tr = Frame(self.window, background='green')
        self.frame_tr.grid(row=0, column=3, padx=5, pady=5, rowspan=3, columnspan=2, sticky=NSEW)
        self.label_tr = Label(self.frame_tr, text = 'Solar Data', justify = RIGHT)
        self.label_tr.grid(row=0, column=512, sticky=NSEW)
        
        self.frame_br = Frame(self.window, background='yellow')
        self.frame_br.grid(padx=5, pady=5, rowspan=2, columnspan=2, sticky=NSEW)
        self.label_br = Label(self.frame_br, text = 'News', justify = RIGHT)
        self.label_br.grid(row=0, column=512, sticky=NSEW)
        
        #main
        self.window.mainloop()
    ```

标签: pythontkinterframeframes

解决方案


我不知道我是否理解你的问题。

frames在内部使用全尺寸,window但内部的元素frames已折叠。您可能还需要使用 grid_rowconfigure/grid_columnconfigureframe_left,frame_trframe_br调整网格内部元素的大小frames

我将元素移动到行和列0,因为空行/列没有大小并且放入列没有意义512

from tkinter import *

class twinsplay:
    
    def __init__(self):
        self.window =  Tk()
        self.window.geometry('1024x768')
        
        self.window.grid_rowconfigure(0, weight=1)
        self.window.grid_columnconfigure(0, weight=1)

        #window title
        self.window.title('Live Feed')


        #frames and labels
        self.frame_left = Frame(self.window, background='magenta')
        self.frame_left.grid(row=0, column=0, padx=5, pady=5, sticky=NSEW)


        self.label_left = Label(self.frame_left, text = 'Weather Data', justify=LEFT, bg='red')
        self.label_left.grid(row=0,column=0, sticky=NSEW)

        self.frame_left.grid_rowconfigure(0, weight=1)
        self.frame_left.grid_columnconfigure(0, weight=1)

        # ---
        
        
        self.frame_tr = Frame(self.window, background='green')
        self.frame_tr.grid(row=0, column=1, padx=5, pady=5, sticky=NSEW)
        
        self.label_tr = Label(self.frame_tr, text = 'Solar Data', justify = RIGHT, bg='green')
        self.label_tr.grid(row=0, column=0, sticky=NSEW)

        self.frame_tr.grid_rowconfigure(0, weight=1)
        self.frame_tr.grid_columnconfigure(0, weight=1)

        # ---
        
        self.frame_br = Frame(self.window, background='yellow')
        self.frame_br.grid(row=1, column=0, padx=5, pady=5, columnspan=2, sticky=NSEW)
        
        self.label_br = Label(self.frame_br, text = 'News', justify = RIGHT, bg='yellow')
        self.label_br.grid(row=0, column=0, sticky=NSEW)

        self.frame_br.grid_rowconfigure(0, weight=1)
        self.frame_br.grid_columnconfigure(0, weight=1)

        #main
        self.window.mainloop()
        
twinsplay()        

在此处输入图像描述


但是,如果您尝试做一些不同的事情,那么也许您必须将grid_rowconfigure/grid_columnconfigure与其他行/列一起使用 - 您可以多次将其与不同的行/列一起使用。


编辑:

在此处输入图像描述

from tkinter import *

class twinsplay:
    
    def __init__(self):
        self.window =  Tk()
        self.window.geometry('1024x768')
        
        # left and right column will use the same size
        self.window.grid_columnconfigure(0, weight=1)
        self.window.grid_columnconfigure(1, weight=1)
        
        # top and bottom rows will use the same size
        self.window.grid_rowconfigure(0, weight=1)
        self.window.grid_rowconfigure(1, weight=1)
                
        #window title
        self.window.title('Live Feed')

        #frames and labels
        
        # frame will use 2 rows 
        self.frame_left = Frame(self.window, background='magenta')
        self.frame_left.grid(row=0, column=0, padx=5, pady=5, sticky=NSEW, rowspan=2)


        self.label_left = Label(self.frame_left, text = 'Weather Data', justify=LEFT, bg='red')
        self.label_left.grid(row=0,column=0, sticky=NSEW)

        self.frame_left.grid_rowconfigure(0, weight=1)
        self.frame_left.grid_columnconfigure(0, weight=1)

        # ---
        
        self.frame_tr = Frame(self.window, background='green')
        self.frame_tr.grid(row=0, column=1, padx=5, pady=5, sticky=NSEW)
        
        self.label_tr = Label(self.frame_tr, text = 'Solar Data', justify = RIGHT, bg='green')
        self.label_tr.grid(row=0, column=0, sticky=NSEW)

        self.frame_tr.grid_rowconfigure(0, weight=1)
        self.frame_tr.grid_columnconfigure(0, weight=1)

        # ---
        
        self.frame_br = Frame(self.window, background='yellow')
        self.frame_br.grid(row=1, column=1, padx=5, pady=5, columnspan=2, sticky=NSEW)
        
        self.label_br = Label(self.frame_br, text = 'News', justify = RIGHT, bg='yellow')
        self.label_br.grid(row=0, column=0, sticky=NSEW)

        self.frame_br.grid_rowconfigure(0, weight=1)
        self.frame_br.grid_columnconfigure(0, weight=1)

        #main
        self.window.mainloop()
        
twinsplay()        

推荐阅读