Tkinter-是否可以在同一帧中使用两个不同的网格?

Tkinter-是否可以在同一帧中使用两个不同的网格?,tkinter,grid,Tkinter,Grid,我写了一个简单的代码: from tkinter import * from tkinter import ttk def ChangeinItalian(): MyLabel.configure(text="Ciao Ciao Ciao Ciao:") def ChangeinEnglish(): MyLabel.configure(text="Hi Hi Hi Hi:") root = Tk() root.geometry(&qu

我写了一个简单的代码:

from tkinter import *
from tkinter import ttk


def ChangeinItalian():
    MyLabel.configure(text="Ciao Ciao Ciao Ciao:")
def ChangeinEnglish():
    MyLabel.configure(text="Hi Hi Hi Hi:")

root = Tk()
root.geometry("550x350")

MyFrame=Frame(root, background="#ffffff", highlightbackground="#848a98", highlightthickness=1)
MyFrame.place(x=5, y=5, width=535, height=300)

MyFrame.grid_columnconfigure(0, minsize=16)
MyFrame.grid_columnconfigure(2, minsize=10)
MyFrame.grid_columnconfigure(3, weight=1)
MyFrame.grid_columnconfigure(4, minsize=10)
MyFrame.grid_columnconfigure(6, minsize=16)
MyFrame.grid_rowconfigure(0, minsize=16, pad=16)
MyFrame.grid_rowconfigure(2, minsize=16, pad=16)

ttk.Label(MyFrame, text="Introduction", background="#ffffff").grid(row=1, column=1, sticky="w")

Canvas(MyFrame, height=1, background="#a0a0a0", highlightthickness=0, highlightbackground="white").grid(row=1, column=3, columnspan=3, sticky="we")

MyLabel=ttk.Label(MyFrame, text="Hi Hi Hi Hi", background="#ffffff")
MyLabel.grid(row=3, column=1, sticky="w")

ttk.Entry(MyFrame, width=70).grid(row=3, column=3)
ttk.Button(MyFrame, text="...", width=5).grid(row=3, column=5, sticky="we")

ItalianButton=ttk.Button(MyFrame, text="Italiano", command=ChangeinItalian)
ItalianButton.place(x=16, y=150)
EnglishButton=ttk.Button(MyFrame, text="English", command=ChangeinEnglish)
EnglishButton.place(x=16, y=200)

root.mainloop()
意大利标签打乱了我心目中的软件设计。第二行(检查我的不可见网格)由一些项目组成:“空间”+“介绍”+“空间”+画布。在标签和画布之间,我希望始终有5个像素的空白,但如果将意大利标签放在第4行和第1列,则不可能。我如何解决这个问题


也许我可以用两个不同的网格来解决我的问题,但我认为这是不可能的。。有关更多说明,您也可以阅读我与Bryan的评论。

网格不是对象,但您可以将帧嵌套到您想要的深度,并在每个帧中使用
网格
打包
放置
,在每个帧中从头开始

也就是说,在您的特定情况下,如果您不希望“test”标签将画布推过,您可以让它跨越所有列

test_label.grid(row=3, column=1, sticky="w", columnspan=3)
我不知道这是不是正确的解决方案,因为还不清楚你到底想实现什么。有一个1像素高的画布有点奇怪,最终的答案取决于您是否有其他小部件以及您希望它们的行为是什么


请记住,我只想使用栅格几何体管理器


就个人而言,我建议反对“我只想使用网格”的心态<代码>网格,
,和
地方
都有优点和缺点。您应该为作业使用正确的工具,
grid
并不总是正确的工具。有时,您可以使用
pack
编写一行代码,在使用
grid

时,这三行代码可以完成。我重构了所有代码,作为如何删除小部件在主网格上的依赖关系的示例。事实上,我使用了
pack
与此无关。当小部件组合放在它们自己的框架中时,依赖项被删除

import tkinter as tk, tkinter.ttk as ttk

#common formatting for our custom Frames
class PackedFrame(tk.Frame):
    def __init__(self, master, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        #grid equivalent of filling the entire next available row
        self.pack(anchor='nw', side='top', fill='x')
        #inherit master background
        self.configure(bg=master['bg'])


#no dependency on master layout
class Introduction(PackedFrame):
    def __init__(self, master, **kwargs):
        PackedFrame.__init__(self, master, **kwargs)
        
        ttk.Label(self, text="Introduction", background=self['bg']).pack(side='left')
        
        #here we use a Separator instead of a Canvas
        ttk.Style().configure('TSeparator', background="#a0a0a0")
        ttk.Separator(self, orient='vertical').pack(side='right', fill='x', expand=True, padx=8)


#no dependency on master layout
class LangFormField(PackedFrame):
    def __init__(self, master, command, lang='english', **kwargs):
        PackedFrame.__init__(self, master, **kwargs)
        
        self.label = ttk.Label(self, background=self['bg'])
        self.label.pack(side='left', anchor='w')
        
        ttk.Entry(self).pack(side='left', anchor='w', fill='x', expand=True, padx=8)
        ttk.Button(self, text="...", width=5).pack(side='left', anchor='e')
        
        #call the appropriate language method
        if hasattr(self, lang) and callable(getattr(self, lang)):
            getattr(self, lang)()
        
    #TRANSLATIONS
    def italiano(self):
        self.label.configure(text='Ciao:')

    def english(self):
        self.label.configure(text='Hi:')


class Root(tk.Tk):
    def __init__(self, **kwargs):
        tk.Tk.__init__(self)
        self.configure(**kwargs)
        self.geometry("550x350")
        
        Introduction(self)
        
        ff = LangFormField(self, lambda:print('clicked'))

        ttk.Button(self, text="Italiano", command=ff.italiano).place(x=16, y=150)
        ttk.Button(self, text="English" , command=ff.english ).place(x=16, y=200)
        
        self.mainloop()


Root(background='#FFFFFF') if __name__ == "__main__" else None

    
    

再见,布莱恩!谢谢你的回复和提示。你的解决方案不对,但不是你的错,是我的错。也许我无法解释我的问题,因为我想。我更改了示例代码。它仍然很简单,但比以前更好了,因为现在可以在帧中看到更多的对象。对于最后两个按钮,我使用了place方法,对于其他按钮,我使用了grid方法,因为正如您之前建议的那样,我意识到并非所有小部件都需要使用grid方法,但问题是什么?问题是我的画布。我想用它来创建一种风格,在我的真实软件中,我将这种画布放在每个标题附近(在本例中,标题是标签“简介”)。画布必须始终在标签后保持5像素,但正如您所见,如果您将语言从英语更改为意大利语,由于网格方法,我无法再达到此目标,但我需要网格方法,因为我需要在更改语言时实现小部件的自动调整大小。在我的示例中,这种自动调整大小的过程是存在的,并且可以工作,但根本不能,因为正如我已经写过的,我希望在“主”标签和画布之间始终有5个像素。我怎样才能达到我的目标?请不要有两个不同的例子。如果第一个示例对该问题无效,请将其删除。我刚刚做了;)