通过模块时的Tk几何管理

时间:2018-07-02 03:12:03

标签: python tkinter tkinter-layout

从概念上讲,如果我定义一个Frame并使用grid创建它,那么在Frame中可以使用任何几何管理器吗?以下是MWE。我的问题是我试图编写一个GUI,其基本布局与grid一起使用,但是在那些小部件中,我却遇到了麻烦的对象设置问题。我认为可能是因为我正在通过模块。我知道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()中得不到预期的行为。假设我要打包两个Label,并对其进行正确调整,以使屏幕右侧回到其父框架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)

1 个答案:

答案 0 :(得分:0)

  

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

是的,可以。每个小部件都可以使用其想要管理自己的子级的任何几何图形管理器,而与其余小部件的用途无关。

正在使用或未使用模块的事实是完全不相关的。