【问题标题】:Orient and Organize Tkinter frames定向和组织 Tkinter 帧
【发布时间】:2021-04-03 17:47:26
【问题描述】:

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

不管怎样,代码如下:

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

【问题讨论】:

  • 空行/列的大小为0 - 所以使用column=512 毫无意义。如果您必须移动对象,那么您可能必须在框架内使用grid_rowconfigure/grid_columnconfigure - self.frame_left.grid_columnconfigure(0, weight=1)
  • 我不明白你期望什么结果。也许画它(在任何图像绘制器中)并添加到问题中。
  • 这能回答你的问题吗? How do I organize my tkinter appllication?

标签: python tkinter frame frames


【解决方案1】:

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

您的frameswindow 内使用全尺寸,但frames 内的元素已折叠。您可能需要将grid_rowconfigure/grid_columnconfigureframe_leftframe_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()        

【讨论】:

  • 我看到您配置了每个框架中的列,我没有尝试过。你得到的输出与我得到的相似,但我想要左边的天气数据框和右边的太阳能数据和新闻。我希望天气数据占据整个一半,而其他两个数据堆叠起来占据右半部分。但我不断得到那个巨大的天气框架。
  • 如果您绘制布局(任何图像画家)并提出问题会更简单。但可能您必须创建两列 - 第一个用于 wather,第二个用于其他元素 - 并为两者使用 grid_columnconfigure -grid_columnconfigure(9, weight=1) grid_columnconfigure(1, weight=1)`,然后它们应该具有相同的宽度。跨度>
  • 我在答案中放了新的例子
  • 谢谢!将来我会先在paint、excel或其他工具中绘制GUI“看起来像”的目标。我了解到标签的网格在框架内,并且我没有正确应用“配置”方法。我对列和行的工作方式有误解。我现在看到,您可以创建它们并可以将框架放入其中。 (我以为它们神奇地存在,我只需要指定......错了!)祝你有个美好的夜晚!
猜你喜欢
  • 1970-01-01
  • 2021-03-08
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
相关资源
最近更新 更多