【问题标题】:Tk geometry management when passing through modules通过模块时的 Tk 几何管理
【发布时间】:2018-07-02 03:12:03
【问题描述】:

从概念上讲,如果我定义一个Frame 并使用grid 创建它,那么我可以在Frame 中使用任何几何管理器吗?下面是一个 MWE。我的问题是我正在尝试编写一个基本布局为grid 的 GUI,但在这些小部件中,我在设置对象时遇到了很多麻烦。我认为这可能是因为我正在通过模块。我知道this answer here,它提供了一些启示,但是如果我将一个 tk Frame 对象传递给一个类,对它做一堆 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_widget.pack() 中没有得到预期的行为。假设我想打包两个标签并对其进行正确调整,因此在屏幕右侧回到其父框架header_above。我怎样才能做到这一点。因为现在它回来了左调整。

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 解释的 here。 side arg 只是告诉 pack 从哪里开始打包,它不控制对齐。

标签: python tkinter tkinter-layout


【解决方案1】:

从概念上讲,如果我定义一个框架并使用网格创建它,那么在框架内我可以使用任何几何管理器吗?

是的,你可以。每个小部件都可以使用它想要管理自己的孩子的任何几何管理器,独立于其余小部件使用什么。

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

【讨论】:

  • 我认为 OP 的真正问题是关于小部件对齐。关于在子级中使用不同布局管理器的内容仅作为小部件未按预期对齐的可能原因被提及。
  • @PM2Ring:很难说。他们没有提供工作代码<shrug>。我想,既然他在第一句话就问了一个问题,他就想知道这个问题的答案。
  • @BryanOakley 使代码可执行。我不明白的另一种行为...在sub_widget.pack() 调用中,如果我输入side=RIGHT 会出现错误,NameError: global name 'RIGHT' is not defined`。
猜你喜欢
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多