Ярлыки Tkinter не заполняются в направлении Y после использования пакета, хотя был добавлен fill = tk.Y - PullRequest
0 голосов
/ 11 января 2020

Я искал разные источники, но безрезультатно.

В моем окне tkinter я запустил Labels, которые начинаются с "start" до 1 и вплоть до 100. У меня две проблемы:

  1. Мои ярлыки не растягиваются в направлении Y, даже если вызывается fill = tk.Y (для self.firstlabel.pack и x.pack), о чем свидетельствует зеленый фон , Почему это происходит?

  2. Я также пытался получить высоту холста, сначала вызвав self.update (), а затем распечатав высоту холста с помощью print (self.canvas.winfo_height) ()). Однако высота холста по-прежнему равна 1. Почему это так?

Спасибо всем заранее за ваши ответы!

import tkinter as tk

class Test(tk.Tk):

    def __init__(self, tasks=None):
        super().__init__()

        self.title("Test")

        # setting up container
        container = tk.Frame(self, background="bisque")
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        container.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.E, tk.W))

        container.grid_columnconfigure(0, weight=1)
        container.grid_rowconfigure(0, weight=3)
        container.grid_rowconfigure(1, weight=1)

        # two frames in container, container1 for labels, container2 for textbox
        self.container1 = tk.Frame(container, background="yellow")
        self.container2 = tk.Frame(container, background="blue")
        self.container1.grid(row=0, sticky=(tk.N, tk.S, tk.E, tk.W))
        self.container2.grid(row=1, sticky=(tk.N, tk.S, tk.E, tk.W))

        self.canvas = tk.Canvas(self.container1, borderwidth=0, background="green")
        self.frameinsidecanvas = tk.Frame(self.canvas, background="pink")
        self.canvas.pack(fill="both", expand=True)
        self.frameinsidecanvas.pack(fill="both", expand=True)

        self.update()
        print(self.canvas.winfo_height())

        # setup scrollbar
        self.horizontalscrollbar = tk.Scrollbar(self.container1, orient="horizontal", command=self.canvas.xview)
        self.canvas.configure(xscrollcommand=self.horizontalscrollbar.set)
        self.horizontalscrollbar.pack(side="bottom", fill="x")

        self.canvas.create_window((0, 100), window=self.frameinsidecanvas, anchor="w")

        self.textbox = tk.Text(self.container2, height=1)
        self.textbox.pack(fill="both", expand=True)

        # creating the instructional label
        self.firstlabel = tk.Label(self.frameinsidecanvas, text="Start")
        # self.tasks.append(self.firstlabel)

        self.firstlabel.pack(side="left", fill=tk.Y, expand=True)

        # showing the labels
        for labels in range(0,100):
            x = tk.Label(self.frameinsidecanvas, text=str(labels))
            x.pack(side=tk.LEFT, fill=tk.Y, expand=True)

        self.bind("<Configure>", self.on_frame_configure)

    def on_frame_configure(self, event=None):
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

if __name__ == "__main__":
    test = Test()
    test.wm_geometry("1100x500")
    test.mainloop()

1 Ответ

0 голосов
/ 11 января 2020

Проблема в том, что в начале программы высота холста равна 1. После этого окно tkinter отображается, оно меняет значение.

Вы можете просто привязать список холста к <Configure> для получения при изменении высоты и после изменения внутренней структуры следствия.

import tkinter as tk
# You want to display the labels in column or that each label had the height of the canvas?
class Test(tk.Tk):

    def __init__(self, tasks=None):
        super().__init__()
        self.canvas_width = None

        self.title("Test")

        # setting up container
        container = tk.Frame(self, background="bisque")
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        container.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.E, tk.W))

        container.grid_columnconfigure(0, weight=1)
        container.grid_rowconfigure(0, weight=3)
        container.grid_rowconfigure(1, weight=1)

        # two frames in container, container1 for labels, container2 for textbox
        self.container1 = tk.Frame(container, background="yellow")
        self.container2 = tk.Frame(container, background="blue")
        self.container1.grid(row=0, sticky=(tk.N, tk.S, tk.E, tk.W))
        self.container2.grid(row=1, sticky=(tk.N, tk.S, tk.E, tk.W))

        self.canvas = tk.Canvas(self.container1, borderwidth=0, background="black")

        self.frameinsidecanvas = tk.Frame(self.canvas, background="pink")
        self.canvas.pack(fill="both", expand=True)
        self.frameinsidecanvas.pack(fill="both", expand=True)

        # setup scrollbar
        self.horizontalscrollbar = tk.Scrollbar(self.container1, orient="horizontal", command=self.canvas.xview)
        self.canvas.configure(xscrollcommand=self.horizontalscrollbar.set)
        self.horizontalscrollbar.pack(side="bottom", fill="x")

        self.canvas.create_window((0, 100), window=self.frameinsidecanvas, anchor="w")

        self.textbox = tk.Text(self.container2, height=1)
        self.textbox.pack(fill="both", expand=True)

        # creating the instructional label
        self.firstlabel = tk.Label(self.frameinsidecanvas, text="start")
        # self.tasks.append(self.firstlabel)

        self.firstlabel.pack(side="left", fill=tk.Y)

        # showing the labels
        for label_index in range(0, 10):
            x = tk.Label(self.frameinsidecanvas, text=label_index)
            x.pack(side=tk.LEFT, fill=tk.Y, expand=True)

        self.canvas.bind("<Configure>", self.update_width)

    def update_width(self, e):
        self.canvas_width = self.canvas.winfo_width()
        self.canvas_height = self.canvas.winfo_height()
        self.firstlabel.configure(height=self.canvas_height)
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

if __name__ == "__main__":
    test = Test()
    test.wm_geometry("1100x500")
    test.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...