Как правильно создать класс для кнопки, которая будет открывать новое окно без передачи аргументов?

Здравствуйте! У меня возникают значительные трудности с пониманием концепций объектно-ориентированного программирования (ООП). Я изучал эту тему, читал материалы и смотрел видео, но не могу реализовать свои идеи. Можете подсказать, как правильно подойти к реализации следующего кода? <br/> *Некоторые ненужные (но исправно работающие) моменты я отметил с использованием <i>pass</i>, чтобы не перегружать код. <br/> <pre><code class="python">from tkinter import *
import webbrowser

class FuncButton:
	'''В данном классе происходит исполнение функций, при нажатии на кнопки'''
	def btn1():
		pass  # В pass новые окна не создаются. Когда я нажимаю на 
	def btn2():  # кнопку вне класса, просто запускается простая функция - 
		pass  # и всё работает как надо
	def btn3():  
		pass
	def website():  # Вот тут начинаются проблемы, если кнопки нет
		site_root = Tk()  # внутри website() - всё работает нормально
		site_root.geometry('600x500')
		site_root.title('New window')
		site_root.resizable(width=False, height=False)

		btnSc = Button(site_root, text='Проба', bg='blue', font=('Arial', 16, 'bold'),
		command=lambda: webbrowser.get(using=None).open_new_tab('https://www.youtube.com'))
		btnSc.pack(x=50, y=50)

		site_root.mainloop()

main_root = Tk()
main_root.geometry('600x500')
main_root.title('Main window!')
main_root.resizable(width=False, height=False)
main_root.image = PhotoImage(file='BG.png')
bg_logo = Label(main_root, image=main_root.image)
bg_logo.grid(row=0, column=0)

btnOne = Button(main_root, text='ONE', bg='yellow', font=('Arial', 16, 'bold'),  
			  command=lambda: FuncButton.btn1())
btnOne.place(x=88, y=155, width = 195, height=40)

btnTwo = Button(main_root, text='TWO', bg='red', font=('Arial', 16, 'bold'),  
			  command=lambda: FuncButton.btn2())
btnTwo.place(x=88, y=200, width = 195, height=40)

btnThree = Button(main_root...
  • 13 декабря 2024 г. 5:23
Ответы на вопрос 2
Для создания класса кнопки, который будет открывать новое окно, вам нужно будет сделать несколько вещей. Во-первых, вам нужно создать метод, который будет открывать новое окно. Во-вторых, вам нужно убедиться, что ваш метод имеет доступ к Tk-окну, которое вы хотите открыть.

Вот пример реализации класса `FuncButton`, который открывает новое окно, когда вы нажимаете на кнопку. Я добавил новый метод `open_new_window`, который создает новое окно:

```python
from tkinter import *
import webbrowser

class FuncButton:
    """В этом классе происходит исполнение функций, при нажатии на кнопки"""
    
    @staticmethod
    def btn1():
        print("Кнопка ONE нажата")  # Здесь вы можете добавить логику для первой кнопки

    @staticmethod
    def btn2():
        print("Кнопка TWO нажата")  # Здесь вы можете добавить логику для второй кнопки

    @staticmethod
    def open_new_window():
        site_root = Toplevel()  # Используем Toplevel для создания нового окна
        site_root.geometry('600x500')
        site_root.title('New window')
        site_root.resizable(width=False, height=False)

        btnSc = Button(site_root, text='Проба', bg='blue', font=('Arial', 16, 'bold'),
                       command=lambda: webbrowser.get(using=None).open_new_tab('https://www.youtube.com'))
        btnSc.pack(x=50, y=50)

        site_root.mainloop()

main_root = Tk()
main_root.geometry('600x500')
main_root.title('Main window!')
main_root.resizable(width=False, height=False)

# Пример кнопки на основной панели, которая открывает новое окно
btnOne = Button(main_root, text='ONE', bg='yellow', font=('Arial', 16, 'bold'),  
                command=FuncButton.btn1)
btnOne.place(x=88, y=155, width=195, height=40)

btnTwo = Button(main_root, text='TWO', bg='red', font=('Arial', 16, 'bold'),
                command=FuncButton.btn2)
btnTwo.place(x=88, y=200, width=195, height=40)

# Кнопка, чтобы открыть новое окно
btnNewWindow = Button(main_root, text='Open New Window', bg='green', font=('Arial', 16, 'bold'),
                      command=FuncButton.open_new_window)
btnNewWindow.place(x=88, y=250, width=195, height=40)

main_root.mainloop()
```

### Объяснение:
1. **@staticmethod**: Мы используем декоратор `@staticmethod` для методов, потому что эти методы не требуют доступа к экземпляру класса и могут быть вызваны напрямую через имя класса.

2. **Toplevel**: Вместо создания окна с помощью `Tk()`, используйте `Toplevel()`, чтобы открыть новое окно поверх основного окна.

3. **Основной цикл**: Основной цикл (`mainloop()`) вызывается только в главном окне, поэтому в новом окне его не нужно вызывать. Tkinter сам обрабатывает это.

4. **Кнопка открытия нового окна**: Для демонстрации добавлена кнопка, которая открывает новое окно, когда вы на нее нажмете.

Теперь, когда вы запускаете этот код, вы должны увидеть основное окно с тремя кнопками, и нажатие на кнопку "Open New Window" откроет новое окно с кнопкой, которая открывает определенный веб-сайт.
Решайте последовательно проблемы. 
Посмотрите, например, что у метода pack() нет таких параметров: https://metanit.com/python/tkinter/2.4.php
Поменяйте на что-нибудь разрешённое: btnSc.pack(anchor=CENTER)
И будет запускаться ваше окно с кнопкой на ютуб:
Похожие вопросы