Кадр Python tkinter не отображается должным образом

Рамка banner_strip не отображается, когда я раскомментирую строку, начинающуюся с main_frame= self.create_widget....

если строка закомментирована, то она отображается так, как я этого хочу. Также, когда я передаю row = 0 вместо 1 в self.banner_strip = self.create_widget(), а затем раскомментирую вышеупомянутую строку, тогда появляется эта полоса кадра, но в середине кадра над меткой «Это какой-то текст». Любая идея, что я делаю неправильно здесь?

from tkinter import *

class Application():
    def __init__(self, master):

        self.master = master
        self.master.geometry("700x400+250+150")
        self.master.resizable(False, False)

        self.banner_frame = self.create_widget(master_widget = self.master, widget = Frame(), width = 700, height = 70, bg = '#255869', row = 0, column = 0, bd = 0)
        self.banner_label = self.create_widget(master_widget = self.banner_frame, widget = Label(), bg = '#255869', row = 0, column = 0, pady = 20, text = "This is some text")
        self.banner_strip = self.create_widget(master_widget = self.banner_frame, widget = Frame(), width = 700, height = 10, bg = '#BCC947', row = 1, column = 0)
        #self.main_frame = self.create_widget(self.master, widget = Frame(), width = 700, height = (400 - 80), bd = 0, row = 1, column = 0)

    def create_widget(self, master_widget = None, widget = None, width = 0, height = 0, bg  = None, fg = None, row = 0, column = 0, text = None, bd = None, padx = 0, pady = 0 ):
        widget_type = type(widget)(width = width, height = height, bg = bg, fg  = fg, text = text, bd = bd)
        widget_type.grid(row = row, column = column)
        return widget_type

cl = Tk()
c = Application(cl)
cl.mainloop()

Пожалуйста, помогите мне, если кто-то знает решение. Благодарю вас!

Редактировать: это точно такая же программа, но без использования метода create_widget(). В этом label_frame row=0 и main_frame row=1 работают отлично

from tkinter import *

class Application():
    def __init__(self, master):
        self.master = master
        self.master.geometry("700x400+250+150")
        self.master.title("GetCaseQob v2.1")

        self.master.resizable(False, False)

        self.banner_frame = Frame(master, width = 700, height = 70, bd = 0, bg = '#255869')
        self.banner_frame.grid(row = 0, column = 0)

        self.banner_strip = Frame(self.banner_frame, width = 700, height = 10, bd = 0, bg = '#BCC947')
        self.banner_strip.grid(row = 1, column = 0)

        self.banner = Label(self.banner_frame, bg = '#255869', text = 'This is some text')
        self.banner.grid(row = 0, column = 0, pady = 20)

        self.main_frame = Frame(master, width = 700, height = (400-70), bd = 0)
        self.main_frame.grid(row = 1, column = 0)
        self.main_frame.grid_propagate(0)

cl = Tk()
c = Application(cl)
cl.mainloop()

person Faisal Khan    schedule 05.09.2017    source источник
comment
это просто дубликат вашего исходного вопроса с лучшим примером? Если это так, вместо того, чтобы создавать еще один вопрос, вы должны отредактировать оригинал. Нам не нужны два вопроса, задающих одно и то же.   -  person Bryan Oakley    schedule 05.09.2017
comment
удалил предыдущий вопрос   -  person Faisal Khan    schedule 05.09.2017


Ответы (1)


Обновлять:

Похоже, настоящая проблема заключается в том, что вам не хватает одной из ваших переменных в строке widget_type = type(widget). Вы не используете master_widget для определения каждого виджета.

Изменять:

widget_type = type(widget)(width = width, height = height, bg = bg, fg  = fg, text = text, bd = bd)

To:

widget_type = type(widget)(master_widget, width = width, height = height, bg = bg, fg  = fg, text = text, bd = bd)

Это устранит вашу проблему с кадрированием, но вы увидите некоторые изменения в интервалах макетов. С этим тоже придется разобраться.

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

from tkinter import *

class Application():
    def __init__(self, master):

        self.master = master
        self.master.geometry("700x400+250+150")
        self.master.resizable(False, False)

        self.banner_frame = Frame(self.master, width = 700, height = 70, bg = '#255869', bd = 0)
        self.banner_frame.grid(row = 0, column = 0)
        self.banner_label = Label(self.banner_frame, bg = '#255869', text = "This is some text")
        self.banner_label.grid(row = 0, column = 0, pady = 20)
        self.banner_strip = Frame(self.banner_frame, width = 700, height = 10, bg = '#BCC947')
        self.banner_strip.grid(row = 1, column = 0)
        self.main_frame = Frame(self.master, width = 700, height = (400 - 80), bd = 0)
        self.main_frame.grid(row = 1, column = 0)


cl = Tk()
c = Application(cl)
cl.mainloop()
person Mike - SMT    schedule 05.09.2017
comment
Спасибо, это определенно сработало. Однако не могли бы вы объяснить, почему я должен установить row = 2, когда self.banner_frame и self.main_frame являются дочерними элементами self.master (корневой фрейм... поэтому banner_frame должен быть 0, а main_frame должен быть 1??) и self.label и self.banner_strip являются дочерними элементами self.banner_frame (таким образом, self.label row = 0 и self.banner_strip row = 1). - person Faisal Khan; 05.09.2017
comment
@FaisalKhan Я обновил свой ответ, так как обнаружил основную проблему, вызывающую проблему. - person Mike - SMT; 05.09.2017
comment
@FaisalKhan Я также добавил модифицированную версию кода, которая больше соответствует тому, как обычно пишут свой графический интерфейс, поскольку то, как вы это делаете, кажется немного неортодоксальным. - person Mike - SMT; 05.09.2017
comment
А, кажется, мы написали одновременно :D. Я сделал так, как вы сделали это в вашем ответе, но я разрабатываю графический интерфейс, в котором у меня есть от 30 до 40 различных виджетов, и для каждого виджета повторение одного и того же кода (например, сетки и т. д.) затрудняет отладку. Вот почему я хотел сделать это с помощью метода и передать нужные параметры - person Faisal Khan; 05.09.2017
comment
@FaisalKhan Если вам приходится повторяться при создании виджетов, вы можете рассмотреть возможность использования списка или словаря в качестве предпочтительного метода. Это значительно упрощает устранение неполадок и ремонтопригодность в долгосрочной перспективе. - person Mike - SMT; 05.09.2017