Форум сайта python.su
Создаю поле со вкладками Notebook, при этом каждую вкладку описывают отдельным подклассом класса Frame. Для простоты пока 2 вкладки, и классы описаны в одном файле. Если я называю классы Frame1 и Frame2, то получается картинка, которую я ожидаю - две маленькие квадратные вкладки, одна синяя, другая зелёная. Стоит дать даже одному из классов другое имя, например вместо Frame2 называю Frame3, картинка портится.
Сам код
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()
Отредактировано FishHook (Дек. 2, 2021 14:51:48)
Прикреплённый файлы:
2021-12-02_16-35-22.png (21,8 KБ)
Офлайн
Ivan73@
У вас есть класс с именем Frame1 и переменная с тем же именем,
Frame1 = Frame1(notebook)
x = 1 x = x + 1 print(x) x = '}{YЙ' print(x)
Офлайн
FishHook, по моему давать такое же имя экземпляру класса, как и самому классу, вполне допустимо и не только в Python. И как я говорил, код рабочий, пока не меняете имя класса. Но если Вы так настаиваете, то меняю Frame1 на Frame01 и привожу варианты рабочего кода и нерабочего кода.
Вот рабочий код:
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) Frame01 = Frame1(notebook) notebook.add(Frame01, text = "Connection") Frame02 = Frame2(notebook) notebook.add(Frame02, text = "Transient Response") notebook.place(x=10, y=10) root.mainloop()
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 Frame3(Frame): def __init__(self, container): super().__init__(container) self.Frame3 = Frame(container) self.Frame3.config(height=200, width=203, bg= 'green') self.Frame3.place(x=0, y=24) Frame01 = Frame1(notebook) notebook.add(Frame01, text = "Connection") Frame02 = Frame3(notebook) notebook.add(Frame02, text = "Transient Response") notebook.place(x=10, y=10) root.mainloop()
Отредактировано Ivan73@ (Дек. 2, 2021 15:46:48)
Офлайн
Ivan73@ох черт побери! Объясните, пожалуйста, что вы делаете, например, вот здесь
А вот нерабочий код (точнее работающий неправильно):
self.Frame1 = Frame(container)
Офлайн
FishHook,
Ссылка
https://stackoverflow.com/questions/44745297/adding-notebook-tabs-in-tkinter-how-do-i-do-it-with-a-class-based-structure
пользовался предпоследним и последним примерами, попытался максимально упростить. Мне на вкладке ноутбука нужна не лабел, а поле, на котором я в дальнейшем планировал размещать другие виджеты. Поэтому я создаю экземпляр класса Frame в некоем поле container, а в основной программе, когда обращаюсь к классу, указываю, что container это notebook, и туда надо добавить Frame в виде вкладки.
Пусть у меня где-то неправильный код или хромая логика. Я не понимаю, почему интерфейс меняется при изменении имени, а не параметров!!!
Это что получается. a1=2, а2=3, с=а1+а2, с=5. А стоит мне написать а1=2, а3=3, с=а1+а3, и у меня уже с=6. Это я доступным языком объясняю, что у меня делается в программе.
Офлайн
Вы вот этот пример имеете в виду?
class MainApplication(tk.Tk): def __init__(self): super().__init__() self.title("Example") self.geometry('300x300') self.notebook = ttk.Notebook(self) self.Frame1 = Frame1(self.notebook) self.Frame2 = Frame2(self.notebook) self.notebook.add(self.Frame1, text='Frame1') self.notebook.add(self.Frame2, text='Frame2') self.notebook.pack() class Frame1(ttk.Frame): def __init__(self, container): super().__init__() self.labelA = ttk.Label(self, text = "This is on Frame One") self.labelA.grid(column=1, row=1) class Frame2(ttk.Frame): def __init__(self, container): super().__init__() self.labelB = ttk.Label(self, text = "This is on Frame Two") self.labelB.grid(column=1, row=1) if __name__ == '__main__': app = MainApplication() app.mainloop()
class Frame1(ttk.Frame): def __init__(self, container): super().__init__() self.labelA = ttk.Label(self, text = "This is on Frame One") self.labelA.grid(column=1, row=1) class Frame2(ttk.Frame): def __init__(self, container): super().__init__() self.labelB = ttk.Label(self, text = "This is on Frame Two") self.labelB.grid(column=1, row=1) if __name__ == '__main__': root = Tk() root.geometry('400x400') root.title('Title') root.notebook = notebook = ttk.Notebook(root) frame1 = Frame1(notebook) frame2 = Frame2(notebook) notebook.add(frame1, text='Frame1') notebook.add(frame2, text='Frame2') notebook.pack() root.mainloop()
Отредактировано FishHook (Дек. 2, 2021 17:13:10)
Офлайн
FishHook
Если Вы думаете, что я не прошёл через тот пример, который Вы показали, то Вы ошибаетесь. Данный пример не позволяет управлять ни размером, ни бэкграундов вкладок. Желательно ещё по отдельности, что у меня и получилось. Если бы Вы попробовали его запустить, то увидели бы, что вкладки имеют размер надписи, не более.
Вот если не знаете в чём причина глюка, зачем умничать, искать какой-то изъян, который глюк не устраняет, лишь бы что-то ответить?
Офлайн
Ivan73@Почему по вашему это допустимо? Вы названия делаете одинаковыми чтобы самому запутаться или чтобы была возможность коллизий,или чтобы запутался в одинаковых названиях иностранный разведчик?
по моему давать такое же имя экземпляру класса, как и самому классу, вполне допустимо и не только в Python.
Офлайн
Ivan73@
Вот если не знаете в чём причина глюка, зачем умничать, искать какой-то изъян, который глюк не устраняет, лишь бы что-то ответить?
class Frame1(Frame): def __init__(self, container): super().__init__(container) self.Frame1 = Frame(container) self.Frame1.config(bg='blue') Frame01 = Frame1(notebook)
Офлайн
xam1816, видел что 2 фрейма по факту один в другом, но не знал, как управлять. Уже подсказали self.config, не заводя нового фрейма
https://stackoverflow.com/questions/70199772/tkinter-gui-appearance-containing-notebook-changes-when-i-change-class-name-but
Всем спасибо!
Офлайн