Функция не видит виджеты внутри класса
Прощу помощи. По какой такой неведомой мне причине, вот таким образом внутри класса можно обратиться к 'w1'
class Starter:
A = 40
B = 100
C = 70
win = Tk()
win.title='Press'
win.geometry("300x300")
lb = resp().make_label(10,2,win,sider = 'top',bg = 'gold')
bt = resp().make_button(w = 5,h = 1,frame_name=win,sider = 'bottom')
w1 = Scale(win,width = 100,from_ = 0, to = 100, orient = HORIZONTAL)
w1.get()
canv = Canvas(win,width = 200,height = 200,bg = 'blue')
canv.create_polygon((A,B),(A,C),(B,C),outline = 'black',fill = "yellow")
canv.pack()
w1.pack()
А вот так нельзя.
class Starter:
A = 40
B = 100
C = 70
def ab_t(event):
w1.get()
win = Tk()
win.title='Press'
win.geometry("300x300")
lb = resp().make_label(10,2,win,sider = 'top',bg = 'gold')
bt = resp().make_button(w = 5,h = 1,frame_name=win,sider = 'bottom')
w1 = Scale(win,width = 100,from_ = 0, to = 100, orient = HORIZONTAL)
bt.bind("<Button-1>", ab_t)
canv = Canvas(win,width = 200,height = 200,bg = 'blue')
canv.create_polygon((A,B),(A,C),(B,C),outline = 'black',fill = "yellow")
canv.pack()
w1.pack()
Ответы (2 шт):
Автор решения: kwas
→ Ссылка
def ab_t(self, event):
self.w1.get()
В методах классов первый аргумент всегда self(он работает как this)
Автор решения: insolor
→ Ссылка
Вы неправильно "готовите" классы. Код должен быть в методах класса, а не на верхнем уровне классов. На верхнем уровне должны только прописываться поля, общие для всех объектов данного класса.
То что вы сейчас делаете можно делать через обычные функции:
from tkinter import *
def Starter():
A = 40
B = 100
C = 70
def ab_t(event):
python(w1.get())
win = Tk()
win.title='Press'
win.geometry("300x300")
# lb = resp().make_label(10,2,win,sider = 'top',bg = 'gold')
# bt = resp().make_button(w = 5,h = 1,frame_name=win,sider = 'bottom')
bt = Button(win)
w1 = Scale(win,width = 100,from_ = 0, to = 100, orient = HORIZONTAL)
bt.bind("<Button-1>", ab_t)
canv = Canvas(win,width = 200,height = 200,bg = 'blue')
canv.create_polygon((A,B),(A,C),(B,C),outline = 'black',fill = "yellow")
canv.pack()
w1.pack()
win.mainloop()
Starter()
То же самое через условно "правильный" класс:
from tkinter import *
class Starter:
def __init__(self):
A = 40
B = 100
C = 70
def ab_t(event):
print(w1.get())
win = Tk()
win.title='Press'
win.geometry("300x300")
# lb = resp().make_label(10,2,win,sider = 'top',bg = 'gold')
# bt = resp().make_button(w = 5,h = 1,frame_name=win,sider = 'bottom')
bt = Button(win)
w1 = Scale(win,width = 100,from_ = 0, to = 100, orient = HORIZONTAL)
bt.bind("<Button-1>", ab_t)
canv = Canvas(win,width = 200,height = 200,bg = 'blue')
canv.create_polygon((A,B),(A,C),(B,C),outline = 'black',fill = "yellow")
canv.pack()
w1.pack()
win.mainloop()
Starter()
Или если нужно чтобы ab_t было отдельным методом, а не вложенной функцией:
from tkinter import *
class Starter:
def ab_t(self, event):
python(self.w1.get())
def __init__(self):
A = 40
B = 100
C = 70
win = Tk()
win.title='Press'
win.geometry("300x300")
# lb = resp().make_label(10,2,win,sider = 'top',bg = 'gold')
# bt = resp().make_button(w = 5,h = 1,frame_name=win,sider = 'bottom')
bt = Button(win)
self.w1 = Scale(win,width = 100,from_ = 0, to = 100, orient = HORIZONTAL)
bt.bind("<Button-1>", self.ab_t)
canv = Canvas(win,width = 200,height = 200,bg = 'blue')
canv.create_polygon((A,B),(A,C),(B,C),outline = 'black',fill = "yellow")
canv.pack()
self.w1.pack()
win.mainloop()
Starter()