Задать вопрос
@BeginnerGuy

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

с ООП идёт туго от слова совсем (вроде и читал, и с ролики смотрел) - не получается и всё... подскажите как корректно реализовать идею?
*некоторые ненужные (исправно работающие) моменты помечу pass, чтобы не громоздить код.
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, text='THREE', bg='pink', font=('Arial', 16, 'bold'),
			  command=lambda: FuncButton.btn3())
btnThree.place(x=88, y=245, width=195, height=40)

btnS = Button(main_root, text='WEBSITE', bg='lightgreen', font=('Arial', 16, 'bold'),
			  command=lambda: FuncButton.website())
btnS.place(x=88, y=290, width=195, height=40)

main_root.mainloop()

Обычно вижу ошибки такого рода, но как лучше решить - без понятия:
Exception in Tkinter callback
Traceback (most recent call last):
1) File ". . .Programs\Python\Python311\Lib\tkinter\__init__.py", line 1948, in __call__
return self.func(*args)
2) File ". . .Мой проект\main.py", line 52, in
command=lambda: FuncButton.website())
3) File ". . .Мой проект\main.py", line 27, in website
btnS.pack(x=50, y=50)
4) File ". . .Programs\Python\Python311\Lib\tkinter\__init__.py", line 2452, in pack_configure
self.tk.call(
_tkinter.TclError: bad option "-x": must be -after, -anchor, -before, -expand, -fill, -in, -ipadx, -ipady, -padx, -pady, or -side
5) (или ошибки после создания аргументов, self, имена переменных и прочее)
  • Вопрос задан
  • 100 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
@dim5x
ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
Решайте последовательно проблемы.
Посмотрите, например, что у метода pack() нет таких параметров: https://metanit.com/python/tkinter/2.4.php
Поменяйте на что-нибудь разрешённое: btnSc.pack(anchor=CENTER)
И будет запускаться ваше окно с кнопкой на ютуб:
675bcf788d595340062233.png
Ответ написан
Lord_of_Rings
@Lord_of_Rings
Дунадан - северный странник. Злой, но очень добрый
1. Как верно заметил dim5x у метода pack() нет параметров x и y, поэтому вместо pack вы можете использовать place(). В данном случае btnSc.place(x=50, y=50)
2. Зачем вы используете класс FuncButton если его методы не используют экземпляр класса? В этом нет никакого смысла. Но если уж очень хочется, то я рекомендовал бы использовать декоратор @staticmethod

Все вместе получается так:
код
from tkinter import *
import webbrowser

class FuncButton:

    @staticmethod
    def btn1():
        pass

    @staticmethod
    def btn2():
        pass

    @staticmethod
    def btn3():
        pass

    @staticmethod
    def website():
        site_root = Tk()
        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.place(x=50, y=50)  # Используем place вместо pack

        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, text='THREE', bg='pink', font=('Arial', 16, 'bold'),
                  command=lambda: FuncButton.btn3())
btnThree.place(x=88, y=245, width=195, height=40)

btnS = Button(main_root, text='WEBSITE', bg='lightgreen', font=('Arial', 16, 'bold'),
              command=lambda: FuncButton.website())
btnS.place(x=88, y=290, width=195, height=40)

main_root.mainloop()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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