Найти - Пользователи
Полная версия: Tkinter Notebook изменяется внешний вид при изменении имени класса
Начало » GUI » Tkinter Notebook изменяется внешний вид при изменении имени класса
1 2
Ivan73@
Создаю поле со вкладками 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
Ivan73@
У вас есть класс с именем Frame1 и переменная с тем же именем,
 Frame1 = Frame1(notebook)
вас это не смущает?
ну, например, если я напишу такой код
 x = 1
x = x + 1
print(x)
x = '}{YЙ'
print(x)
что напечатает программа?
Ivan73@
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, а результат разный.
FishHook
Ivan73@
А вот нерабочий код (точнее работающий неправильно):
ох черт побери! Объясните, пожалуйста, что вы делаете, например, вот здесь
 self.Frame1 = Frame(container)
что имеено по-вашему здесь происходит? И не могли бы вы дать ссылку на пример, на который вы опирались?
Ivan73@
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. Это я доступным языком объясняю, что у меня делается в программе.
FishHook
Вы вот этот пример имеете в виду?
 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()
Ivan73@
FishHook
Если Вы думаете, что я не прошёл через тот пример, который Вы показали, то Вы ошибаетесь. Данный пример не позволяет управлять ни размером, ни бэкграундов вкладок. Желательно ещё по отдельности, что у меня и получилось. Если бы Вы попробовали его запустить, то увидели бы, что вкладки имеют размер надписи, не более.
Вот если не знаете в чём причина глюка, зачем умничать, искать какой-то изъян, который глюк не устраняет, лишь бы что-то ответить?
xam1816
Ivan73@
по моему давать такое же имя экземпляру класса, как и самому классу, вполне допустимо и не только в Python.
Почему по вашему это допустимо? Вы названия делаете одинаковыми чтобы самому запутаться или чтобы была возможность коллизий,или чтобы запутался в одинаковых названиях иностранный разведчик?
xam1816
Ivan73@
Вот если не знаете в чём причина глюка, зачем умничать, искать какой-то изъян, который глюк не устраняет, лишь бы что-то ответить?
 class Frame1(Frame):
    def __init__(self, container):
        super().__init__(container)
        self.Frame1 = Frame(container)
        self.Frame1.config(bg='blue')
Frame01 = Frame1(notebook)

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

Всем спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB