@Planting_Sproot

Попытался перенести код на tkinter в формат ооп, до этого выводил всё корректно, сейчас же выводит только пустое окно, что делать?

вот сам код:
from tkinter import *
from tkinter import ttk
from math import sqrt
from PIL import ImageTk
import ttkbootstrap as tb

root_changes_2 = tb.Window(themename='darkly')
root_changes_2.geometry('600x600')
root_changes_2.mainloop()

class Main_window:
def __init__(self, root_changes):
# основная страница
self.top_place = tb.Frame(root_changes, height=10, relief='solid')
self.info_place = ttk.Frame(root_changes)
self.values_place = ttk.Frame(self.info_place, relief='solid')
self.top_place.pack(fill=X, pady=60)
self.values_place.pack(side=LEFT, padx=10, pady=10)
self.info_place.pack(fill=BOTH)

# панель с переходами
self.value_for_optBtn = StringVar(root_changes)
value_for_optBtn_2 = ['Жесткость пружины', 'Зоны резонанса', 'История', 'Настройки', 'О проекте']
self.mirea_image = ImageTk.PhotoImage(file='АЛЬТАИР.jpg')
self.btn_main_root = tb.Button(image=self.mirea_image, bootstyle='dark').place(anchor='nw')
self.btn_calculate_f = tb.OptionMenu(self.top_place, self.value_for_optBtn, *value_for_optBtn_2, bootstyle='Light').pack(side=LEFT, padx=10)
self.btn_history = tb.Button(self.top_place, text='История', bootstyle='Light').pack(side=LEFT, padx=10)
self.btn_optins = tb.Button(self.top_place, text='Настройки', bootstyle='Light').pack(side=LEFT, padx=10)
self.btn_about_project = tb.Button(self.top_place, text='О проекте', bootstyle='Light').pack(side=LEFT, padx=10)
self.change_menu = Menu(self.top_place)
root_changes.config(menu=self.change_menu)
self.change_list = Listbox(self.info_place)

lst_button_options = ['Жесткость пружины', 'Зоны резонанса', 'История', 'Настройки', 'О проекте']
self.lst_button_options_varity = Variable(value=lst_button_options)
self.calculate_menu = Menu(self.change_menu, tearoff=1)
self.calculate_menu.add_command(label='Жесткость пружины')
self.calculate_menu.add_command(label='Просто калькулятор')
self.calculate_menu.add_command(label='Резонанс')
self.change_menu.add_cascade(label='калькулятор', menu=self.calculate_menu)
self.lst_changes = ['Главная', 'Жесткость пружины', 'Резонанс', 'Просто калькулятор', 'История']
self.count_vars = 0

self.change_list = Listbox(self.info_place, height=100, relief='solid')
self.change_list.pack(side=RIGHT, fill=Y, padx=5, pady=5)
self.change_list.insert(0, 'Главная')
self.change_list.insert(1, 'Жесткость пружины')
self.change_list.insert(2, 'Резонанс')
self.change_list.insert(3, 'Просто калькулятор')
self.change_list.insert(4, 'История')
  • Вопрос задан
  • 143 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
1. Оформи код. Кнопка </> в помощь. Сейчас нечитаемо.
2. Включить голову и разобраться, как же работает графический интерфейс (потому что принципы одинаковые в любом языке практически). Ну и немножко подучить Питон на более простых примерах.

root_changes_2.mainloop() запускает основной рабочий цикл. В нём программа получает сообщения от ОС о действиях пользователя и реагирует на них. Цикл прерывается, когда закрывается основное окно (ты хранишь ссылку на него в root_changes_2).
Как следствие, программа будет стоять на этой строке, пока ты не закроешь окно, и ТОЛЬКО ПОТОМ перейдёт к объявлению класса Main_window.

Это объявление, разумеется, ничего не даёт - ведь ты просто объявил класс, но не создал его экземпляр. А после объявления класса у тебя ничего нет, поэтому скрипт завершает работу.
Я ФЗ что такое ttkbootstrap, поэтому покажу простой пример на голом tkinter.

import tkinter as tk
import tkinter.messagebox as tkmb

class MainWindow(tk.Tk):
    """Главное окно программы наследуется от Tk. 
    Вспомогательные окна - от TopLevel.
    Составные элементы управления - от Frame."""
    
    def __init__(self):
        """Метод __init__() автоматически вызывается при создании нового экземпляра класса."""
        super().__init__()  # обязательно вызываем конструктор родительского класса!
        # при закрытии нашего окна вызовется метод __done()
        # если эта функциональность не нужна, можно убрать эту строку
        self.protocol('WM_DELETE_WINDOW', self.__done)  
        # пример создания элементов управления
        # имена, начинающиеся с __, не видны снаружи класса
        # мы присваиваем не просто переменным, а полям объекта. Эти поля будут видны в других методах.
        self.__entry = tk.Entry(self)  # поле ввода будет вложено непосредственно в наше окно
        self.__entry.pack(side=tk.TOP, fill=tk.X, expand=True)
        self.__btn = tk.Button(self, text='Нажми меня', command=self.__btn_pressed)  # кнопка и реакция на неё
        self.__btn.pack(side=tk.TOP)
    
    def __done(self):
        """Мы прописали вызов этого метода при закрытии окна. 
        Тут мы можем корректно завершить работу нашей программы, а потом подтвердить закрытие."""
        self.destroy()  # подтверждаем закрытие. Если этот вызов не сделать, окно не закроется. Иногда это нужно.
    
    def __btn_pressed(self):
        """Реакция на кнопку."""
        text = self.__entry.get()  # мы можем обращаться к полям объекта
        tkmb.showinfo(
            title='Вы ввели',
            message=text,
            parent=self
        )


if __name__ == '__main__':  
    # это условие выполнится, только если скрипт запущен непосредственно
    # оно не выполнится, если скрипт импортируется другим скриптом
    # поэтому в такое условие обычно заворачивают "тело" скрипта
    wnd = MainWindow()  # создаём окно
    wnd.mainloop()  # главный рабочий цикл
    # сюда управление будет передано после закрытия окна
    print('Окно закрыто, пока!')
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@w9191
Python
Как вариант
try:
except Exception as e: print (e)
Код свой на котором ошибка в блок try и лови ошибку, если вообще никак, то принтуй и смотри на какой строчке ошибка
Ответ написан
Комментировать
@Planting_Sproot Автор вопроса
Благодарю Vandicar, мне очень помог ваш комментарий
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы