упаковка с использованием ключевого слова tkinter in_ не работает с виджетами, созданными вне подкласса фрейма - PullRequest
0 голосов
/ 11 января 2020

Насколько я понимаю, аргумент ключевого слова in_ для pack / grid должен позволять мне указывать управляющий виджет. Я хочу упаковать произвольные виджеты внутри подкласса Frame, поэтому я пропустил виджеты и упаковал их во время инициализации, но виджеты не появились (хотя пространство в окне, похоже, было выделено ...). Если я создаю виджет внутренне, используя master, то есть root, проблема не возникает, и виджеты отображаются ожидаемым образом.

Следующий рабочий пример и его вывод демонстрируют проблему:

import tkinter as tk
from tkinter import ttk

class ItemContainerExternal(ttk.Frame):
    def __init__(self, master, input_label, input_object):
        ttk.Frame.__init__(self, master)
        self.label = input_label
        self.label.pack(side=tk.LEFT, padx=5, pady=3, fill=tk.X, in_=self)
        self.input_object = input_object
        self.input_object.pack(side=tk.LEFT, padx=5, pady=3, fill=tk.X, in_=self)

    def get(self):
        return variable.get()

class ItemContainerInternal(ttk.Frame):
    def __init__(self, master):
        ttk.Frame.__init__(self, master)
        ttk.Label(master, text='internal').pack(side=tk.LEFT, padx=5, pady=3, fill=tk.X, in_=self)
        self.input_object = ttk.Entry(master)
        self.input_object.pack(side=tk.LEFT, padx=5, pady=3, fill=tk.X, in_=self)

    def get(self):
        return variable.get()

if __name__ == '__main__':
    root = tk.Tk()
    inputobj = ttk.Entry(root)
    inputlabel = ttk.Label(root, text='external')
    ItemContainerExternal(root, inputlabel, inputobj).grid(row=0, column=0)
    ItemContainerInternal(root).grid(row=1, column=0)
    root.mainloop()

enter image description here

Ответы [ 2 ]

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

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

Простым решением является вызов lift() для записи и метки:

class ItemContainerExternal(tk.Frame):
    def __init__(self, master, input_label, input_object):
        ...
        self.input_object.lift()
        self.label.lift()

screenshot

1 голос
/ 29 января 2020

Порядок, в котором создаются виджеты, имеет значение. Более новые виджеты находятся "поверх" предыдущих виджетов.

Вызовите .lower() во фрейме после его создания, при условии, что он создан после всех виджетов, которые вы в него упакуете. Если нет, вам нужно будет либо снова вызвать .lower() во фрейме после создания нового виджета до go внутри него, либо вам придется поднять новый виджет с помощью .lift() согласно ответу Брайана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...