#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
andself.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, спасибо, это работает! Только что попробовал.