Внешний вид графического интерфейса TKInter, содержащий записную книжку, изменяется при изменении имени класса, но не параметров

#python #class #tkinter #frame

#python #класс #tkinter #фрейм

Вопрос:

Я пытаюсь создать приложение с вкладками Notebook, но каждая вкладка должна быть описана отдельно как класс. Для начала я дал 2 имени классов для 2 вкладок как Frame1 и Frame2, но я хочу дать разумные имена. Вот код, который работает:

 from tkinter import *
from tkinter import ttk

root = Tk()
root.geometry('400x400')
root.title('Title')

notebook = ttk.Notebook(root)

class Frame1(Frame):
    def __init__(self, container):
        super().__init__(container)
        self.Frame1 = Frame(container)
        self.Frame1.config(bg='blue')
        self.Frame1.place(x=0, y=24, relwidth=0.9, relheight=0.9)


class Frame2(Frame):
    def __init__(self, container):
        super().__init__(container)
        self.Frame2 = Frame(container)
        self.Frame2.config(height=200, width=203, bg= 'green')
        self.Frame2.place(x=0, y=24)

Frame1 = Frame1(notebook)
notebook.add(Frame1, text = "Connection")

Frame2 = Frame2(notebook)
notebook.add(Frame2, text = "Transient Response")

notebook.place(x=10, y=10)

root.mainloop()
 

Результат на скриншоте — 2 вкладки с синим и зеленым заполнением.
Я хочу дать разумные имена. Как только я меняю имя класса, например, Frame2 на Frame3, изображение портится (см. Скриншот).

Комментарии:

1. Ваш скриншот не был прикреплен, поэтому я не уверен, что означает «портит», но есть некоторые очевидные проблемы с этим кодом. В частности, ваш Frame1 объект (например) является фреймом, но он также создает совершенно отдельный фрейм с именем self.Frame1 . Первое — это то, что вы на самом деле добавляете в свой notebook, а второе — это то, для чего вы устанавливаете цвет. Вам нужно либо полностью избавиться от этого дополнительного фрейма, либо сделать его содержащимся в фактическом фрейме в notebook ( Frame(self) вместо Frame(container) ).

2. Я не вижу скриншотов. Я не понимаю, что вы хотите сделать. Я не знаю, что создает проблему с «разумными именами»

3. BWT: если бы мне пришлось использовать внутренний фрейм, я бы использовал одно и то же имя self.frame в обоих классах вместо self.Frame1 and self.Frame2 — и для меня это "sensible name"

Ответ №1:

Вы не должны создавать фрейм внутри своих классов фреймов. Экземпляры Frame1 и Frame2 уже являются фреймами. И если вы добавите фрейм внутри Frame1 и Frame2 , они должны быть дочерними элементами self , а не container .

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

 class Frame1(Frame):
    def __init__(self, container):
        super().__init__(container, bg='blue')

frame1 = Frame1(notebook)
 

Обратите внимание, что экземпляр Frame1 сам по себе является фреймом, как и любой другой фрейм. Если вы хотите настроить какой-либо из атрибутов, вы можете сделать это, как в моем примере, где я устанавливаю фон при вызове super , но вы также можете вызвать configure метод self в любое время:

 class Frame1(Frame):
    def __init__(self, container):
        super().__init__(container, bg='blue')
        self.configure(width=200, height=200)
 

Вы также можете настроить его вне класса, как и с любым другим виджетом:

 frame1 = Frame1(notebook)
...
frame1.configure(background="bisque")
 

Комментарии:

1. Спасибо за ответ! Но если я не создаю новые фреймы внутри классов фреймов, как я могу установить размер фрейма (вкладки) и цвет фона, желательно разные для каждого фрейма (вкладки)?

2. @Ivan_ если вы не создаете внутренний фрейм, тогда вам понадобится self.config(bg='blue') вместо self.Frame1.config(bg='blue') . И self.config(height=200, width=203, bg= 'green') вместо self.Frame2.config(height=200, width=203, bg= 'green')

3. @Furas, спасибо, это работает! Только что попробовал.