Управление геометрией при прохождении модулей - PullRequest
0 голосов
/ 02 июля 2018

Концептуально, если я определю Frame и создам его, скажем, grid, то в рамках Frame я могу использовать любой из менеджеров геометрии? Ниже MWE. Моя проблема в том, что я пытаюсь написать графический интерфейс, где базовый макет с grid, но внутри этих виджетов у меня масса проблем с установкой объектов. Я думаю это может быть потому, что я прохожу через модули. Я знаю этот ответ здесь , и он проливает некоторый свет, но если я передам объект tk Frame классу, сделаю с ним кучу вещей Tk, как он обрабатывается с точки зрения геометрии управление

В частности, скажем, у меня есть базовая раскладка графического интерфейса:

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)

1 Ответ

0 голосов
/ 02 июля 2018

Концептуально, если я определю фрейм и создам его, скажем, с помощью сетки, то в рамках фрейма я могу использовать любой из менеджеров геометрии?

Да, вы можете. Каждый виджет может использовать любой менеджер геометрии, который он хочет управлять своими собственными дочерними элементами, независимо от того, что используют остальные виджеты.

Тот факт, что модули используются или не используются, совершенно не имеет значения.

...