Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Tkinter Notebook изменяется внешний вид при изменении имени класса [RSS Feed]

#1 Дек. 2, 2021 14:43:42

Ivan73@
Зарегистрирован: 2021-12-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter Notebook изменяется внешний вид при изменении имени класса

Создаю поле со вкладками 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)

Прикреплённый файлы:
attachment 2021-12-02_16-35-22.png (21,8 KБ)

Офлайн

#2 Дек. 2, 2021 14:55:04

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8040
Репутация: +  559  -
Профиль   Отправить e-mail  

Tkinter Notebook изменяется внешний вид при изменении имени класса

Ivan73@
У вас есть класс с именем Frame1 и переменная с тем же именем,

 Frame1 = Frame1(notebook)
вас это не смущает?
ну, например, если я напишу такой код
 x = 1
x = x + 1
print(x)
x = '}{YЙ'
print(x)
что напечатает программа?



Офлайн

#3 Дек. 2, 2021 15:30:58

Ivan73@
Зарегистрирован: 2021-12-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter Notebook изменяется внешний вид при изменении имени класса

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()

Как говорится, найдите 10 отличий. Единственное отличие, что я имя класса Frame2 поменял на Frame3, а результат разный.

Отредактировано Ivan73@ (Дек. 2, 2021 15:46:48)

Офлайн

#4 Дек. 2, 2021 16:28:03

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8040
Репутация: +  559  -
Профиль   Отправить e-mail  

Tkinter Notebook изменяется внешний вид при изменении имени класса

Ivan73@
А вот нерабочий код (точнее работающий неправильно):
ох черт побери! Объясните, пожалуйста, что вы делаете, например, вот здесь
 self.Frame1 = Frame(container)
что имеено по-вашему здесь происходит? И не могли бы вы дать ссылку на пример, на который вы опирались?



Офлайн

#5 Дек. 2, 2021 16:46:54

Ivan73@
Зарегистрирован: 2021-12-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter Notebook изменяется внешний вид при изменении имени класса

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. Это я доступным языком объясняю, что у меня делается в программе.

Офлайн

#6 Дек. 2, 2021 17:11:18

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8040
Репутация: +  559  -
Профиль   Отправить e-mail  

Tkinter Notebook изменяется внешний вид при изменении имени класса

Вы вот этот пример имеете в виду?

 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)

Офлайн

#7 Дек. 2, 2021 18:13:17

Ivan73@
Зарегистрирован: 2021-12-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter Notebook изменяется внешний вид при изменении имени класса

FishHook
Если Вы думаете, что я не прошёл через тот пример, который Вы показали, то Вы ошибаетесь. Данный пример не позволяет управлять ни размером, ни бэкграундов вкладок. Желательно ещё по отдельности, что у меня и получилось. Если бы Вы попробовали его запустить, то увидели бы, что вкладки имеют размер надписи, не более.
Вот если не знаете в чём причина глюка, зачем умничать, искать какой-то изъян, который глюк не устраняет, лишь бы что-то ответить?

Офлайн

#8 Дек. 2, 2021 18:38:48

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 835
Репутация: +  73  -
Профиль   Отправить e-mail  

Tkinter Notebook изменяется внешний вид при изменении имени класса

Ivan73@
по моему давать такое же имя экземпляру класса, как и самому классу, вполне допустимо и не только в Python.
Почему по вашему это допустимо? Вы названия делаете одинаковыми чтобы самому запутаться или чтобы была возможность коллизий,или чтобы запутался в одинаковых названиях иностранный разведчик?

Офлайн

#9 Дек. 2, 2021 18:44:09

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 835
Репутация: +  73  -
Профиль   Отправить e-mail  

Tkinter Notebook изменяется внешний вид при изменении имени класса

Ivan73@
Вот если не знаете в чём причина глюка, зачем умничать, искать какой-то изъян, который глюк не устраняет, лишь бы что-то ответить?
 class Frame1(Frame):
    def __init__(self, container):
        super().__init__(container)
        self.Frame1 = Frame(container)
        self.Frame1.config(bg='blue')
Frame01 = Frame1(notebook)

Вопрос к вам сколько здесь создано фреймов?

Офлайн

#10 Дек. 2, 2021 20:17:33

Ivan73@
Зарегистрирован: 2021-12-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter Notebook изменяется внешний вид при изменении имени класса

xam1816, видел что 2 фрейма по факту один в другом, но не знал, как управлять. Уже подсказали self.config, не заводя нового фрейма
https://stackoverflow.com/questions/70199772/tkinter-gui-appearance-containing-notebook-changes-when-i-change-class-name-but

Всем спасибо!

Офлайн

  • Начало
  • » GUI
  • » Tkinter Notebook изменяется внешний вид при изменении имени класса[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version