gpt4 book ai didi

python - 调整多个网格的大小时遇到​​问题

转载 作者:太空狗 更新时间:2023-10-30 02:05:51 24 4
gpt4 key购买 nike

我有以下代码。我的问题是我无法正确调整框架的大小。当我运行该程序时,一切都符合预期。但是当我调整它的大小时,我想保留原来的 View 。

from Tkinter import *
import os
import sys


ALL=N+S+E+W

class Application(Frame):

def __init__(self,master=None):
Frame.__init__(self,master)
self.master.rowconfigure(0,weight=1)
self.master.columnconfigure(0,weight=1)
self.grid(sticky=ALL)

self.rowconfigure(0,weight=1)
myframe1=Frame(self,bg='green')
myframe1.bind("<Button-1>",self.handler1)
myframe1.grid(row=0,column=0,rowspan=1,columnspan=2,sticky=ALL)
self.rowconfigure(1,weight=1)
myframe2=Frame(self,bg='blue')
myframe2.bind("<Button-1>",self.handler2)
myframe2.grid(row=1,column=0,rowspan=1,columnspan=2,sticky=ALL)


buttons=('Red','Blue','Green','Black')
button=[0]*4
for c in range(4):
self.rowconfigure(c+2,weight=1)
self.columnconfigure(c,weight=1)
button[c]=Button(self,text="{0}".format(buttons[c]),command=lambda x=buttons[c]:self.colors(x))
button[c].grid(row=2,column=c,sticky=E+W)

self.columnconfigure(4,weight=1)
self.rowconfigure(6,weight=1)
button1=Button(self,text='{0}'.format('Open'),command=self.content)
button1.grid(row=2,column=4,sticky=E+W)


f=Frame(self,bg='red')
self.myentry=Entry(f)
self.myentry.grid(row=0,column=4,sticky=ALL)
self.text=Text(f)
self.text.grid(row=1,column=4,sticky=ALL)
f.grid(row=0,column=2,rowspan=2,columnspan=3,sticky=ALL)

...

我尝试了rowconfigurecolumnconfigurerowspancolumnspan的多种组合,但都失败了!

我原来的看法是:

enter image description here

在一个方向调整大小后:

enter image description here

另一个方向:

enter image description here

白色区域是我想要调整大小的 Text 小部件(也是蓝色和绿色区域)。

最佳答案

您的问题是您似乎不太了解网格的工作原理。例如,您只将两个小部件放在红色框架中(self.myentry 和 self.text),但您将它们放在第 2 列和第 4 列中。您是否知道这些列是相对于它们的父级的,而不是作为 GUI 的所有的?您希望它们位于红色框架的第 0 列,然后您希望红色框架位于它是父级的第二列。

解决这个问题的方法是分而治之。首先,将主屏幕划分为逻辑部分,并对这些逻辑部分进行布局,以便它们适当调整大小。然后,对于每个部分内部的任何东西,重复泡沫、冲洗。使用框架进行组织是可行的方法。

以下是我将如何解决您的问题(尽管解决此问题的方法肯定不止一种)。首先,屏幕有两个主要区域:顶部有绿色、蓝色和红色框架及其内容,底部有按钮。顶部区域应该在所有方向上增长和收缩,底部区域只在 X 方向上增长。我会为此创建两个框架,每个部分一个,并使用 pack,因为 pack 是最简单的几何管理器。顶部框架应配置为填充两个方向并展开。底部(带有按钮)应该只填充 X 方向。

您现在有两个彼此独立且具有适当调整大小行为的区域:“主”区域和“工具栏”区域。您可以随意安排这些框架的内部内容,而不必担心这会如何影响主要布局。

在底部框架中,如果您希望所有小部件的大小相同,请使用 pack 并让它们全部填充 X 并扩展,它们将平均填充该区域。如果您希望它们的大小不同,请使用网格,这样您就可以分别控制每一列。

对于顶部,它有三个子部分:红色、绿色和蓝色框架。由于它们并非都是水平或垂直排列的,所以我会使用网格。将绿色放在单元格 0,0 中,将蓝色放在单元格 0,1 中,将红色放在单元格 1,1 中,跨越两行。为第 0 行和第 1 列赋予 1 的权重,使其占据所有松弛部分。

正如我之前所写,这并不是“分而治之”这个特定问题的唯一方法。与其将主应用程序视为两个部分——顶部和底部,顶部部分具有三个子部分,另一种选择是将主窗口分为四个部分:绿色、蓝色、红色和工具栏。关键不是选择完美的定义,而是将布局问题从外到内分解成多个 block 。

这是一个工作示例:

from Tkinter  import *

ALL=N+S+E+W

class Application(Frame):

def __init__(self,master=None):
Frame.__init__(self,master)

# the UI is made up of two major areas: a bottom row
# of buttons, and a top area that fills the result of
# UI
top_frame = Frame(self)
button_frame = Frame(self)

button_frame.pack(side="bottom", fill="x")
top_frame.pack(side="top", fill="both", expand=True)

# top frame is made up of three sections: two smaller
# regions on the left, and a larger region on the right
ul_frame = Frame(top_frame, background="green", width=200)
ll_frame = Frame(top_frame, background="blue", width=200)
right_frame = Frame(top_frame, background="red")

ul_frame.grid(row=0, column=0, sticky=ALL)
ll_frame.grid(row=1, column=0, sticky=ALL)
right_frame.grid(row=0, column=1, rowspan=2, sticky=ALL)
top_frame.columnconfigure(1, weight=1)
top_frame.rowconfigure(0, weight=1)
top_frame.rowconfigure(1, weight=1)

# the right frame is made up of two widgets, an entry
# on top and a text below
entry = Entry(right_frame)
text = Text(right_frame)

entry.pack(side="top", fill="x")
text.pack(side="top", fill="both", expand=True)

# the button frame has five equally spaced buttons
for color in ('Red', 'Blue', 'Green', 'Black'):
b = Button(button_frame, text=color)
b.pack(side="left", fill="x", expand=True)
quit_button = Button(button_frame, text="Quit")
quit_button.pack(side="left", fill="x", expand=True)

root = Tk()
app = Application(root)
app.pack(fill="both", expand=True)
root.mainloop()

关于python - 调整多个网格的大小时遇到​​问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8448690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com