Python 通过模块时的Tk几何体管理

Python 通过模块时的Tk几何体管理,python,tkinter,tkinter-layout,Python,Tkinter,Tkinter Layout,从概念上讲,如果我定义一个框架并使用网格创建它,那么在框架内我可以使用任何几何管理器吗?下面是一个MWE。我的问题是,我正在尝试编写一个GUI,其中基本布局使用网格,但在这些小部件中,设置对象时遇到了大量问题。我想这可能是因为我正在通过模块。我知道,这也说明了一些问题,但是如果我将一个tk框架对象传递给一个类,对它执行一些tk操作,那么在几何体管理方面它是如何处理的呢 具体来说,假设我有一个基本gui布局: import Tkinter as tk from Tkinter import Fra

从概念上讲,如果我定义一个
框架
并使用网格创建它,那么在框架内我可以使用任何几何管理器吗?下面是一个MWE。我的问题是,我正在尝试编写一个GUI,其中基本布局使用
网格
,但在这些小部件中,设置对象时遇到了大量问题。我想这可能是因为我正在通过模块。我知道,这也说明了一些问题,但是如果我将一个tk框架对象传递给一个类,对它执行一些tk操作,那么在几何体管理方面它是如何处理的呢

具体来说,假设我有一个基本gui布局:

import Tkinter as tk
from Tkinter import Frame
from modules.subfolder.name_of_file import SomeClass

class Window(tk.Frame):
    def __init__(self, master):
        self.master = master
        self.configure_gui()
        self.create_widgets()
        self.create_modules()

    def configure_gui(self):
        self.master.wm_attributes('-fullscreen','true')
        self.master.configure(background='black')

        # in pixels
        self.screen_width = self.master.winfo_screenwidth()
        self.screen_height = self.master.winfo_screenheight()

        # max height for header and footer
        self.foot_height = 100
        self.header_above_height = 100
        self.header_below_height = 100

    def create_widgets(self):

        # Main layout - like a document, header footer, main
        self.header_above = Frame(self.master, bg='black', width = self.screen_width, height=self.header_above_height)
        self.header_below = Frame(self.master, bg='black', width = self.screen_width, height=self.header_below_height)
        self.center = Frame(self.master, bg='black', width=self.screen_width)
        self.footer = Frame(self.master, bg='black', width = self.screen_width, height = self.foot_height)

        # this makes row 1 grow first so it will push out
        # to the top and bottom
        self.master.grid_rowconfigure(2, weight=1)
        self.master.grid_columnconfigure(1, weight=1)

        self.header_above.grid(row=0, sticky="ew")
        self.header_below.grid(row=1, sticky="ew")
        self.center.grid(row=2, sticky="nsew")
        self.footer.grid(row=3, sticky="ew")

    def create_modules(self):

        # Module
        self.sub_widget = SomeClass(self.header_above)
        self.sub_widget.pack()
def main():
   root = tk.Tk()
   gui = Window(root)
   root.mainloop()

if __name__ == '__main__':
    main()
通常,我在
self.sub\u widget.pack()中没有得到预期的行为。比如说,我想把两个标签打包,并对它们进行正确的调整,这样就可以在屏幕的右侧回到它的父帧上
header\u
。我怎样才能做到这一点。因为现在它回来了,向左调整

from Tkinter import *
from PIL import Image, ImageTk

class SomeClass(Frame):
    def __init__(self, parent, *args, **kwargs):
        Frame.__init__(self, parent, bg='black')

        self.config(bg='black')

        image = Image.open('images/Moon.png')
        image = image.resize((100, 100), Image.ANTIALIAS)
        image = image.convert('RGB')
        photo = ImageTk.PhotoImage(image)

        self.display_icon = Label(self, image=photo, width=100, height=100)
        self.display_icon.pack(side=RIGHT)

        self.display_name = Label(self,text="name to display",bg='black',fg="white")
        self.display_name.pack(side=TOP)
从概念上讲,如果我定义一个框架并使用网格创建它,那么在框架内我可以使用任何几何管理器吗

是的,你可以。每个小部件都可以使用它想要管理自己子部件的任何几何体管理器,而与其他小部件的使用无关


使用或不使用模块这一事实是完全无关的。

如果在调试时为每个帧指定不同的颜色,则会有所帮助。否则就不可能看到一帧的结束和下一帧的开始。至于对齐问题,正如Bryan所解释的,您需要指定一个锚点。side arg只是告诉pack从哪里开始打包,它不控制对齐。我认为OP的真正问题是关于小部件对齐。关于在子级中使用不同布局管理器的内容只是作为小部件未按预期对齐的可能原因提到的。@PM2Ring:很难说。他们没有提供工作代码
。我想,既然他在第一句话中问了一个问题,他就想得到这个问题的答案。@BryanOakley使代码可执行。另一个我不理解的行为…在
sub_widget.pack()
调用中,如果我把
side=RIGHT
放进去,我会得到一个错误,NameError:global name'RIGHT'没有定义'。