Форум сайта python.su
Добрый день. Выполняю такой код:
from tkinter import * class Calculator(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent print("11111") self.setUI() def button_clicked(self, event): print("event") self.output.delete("0.0","end") self.output.insert("0.0","sdfdsfsd") def setUI(self): print("UI") self.pack(fill=BOTH, expand=1) self.output=Text(self, height=1, width=25) self.output.grid(row=0, column=0, columnspan = 5) #i=0 #currow=1 #while i<=9: # if i>=5: # currow=2 # btn = Button(self, text=i, width=3) # btn.grid(row=currow, column=i % 5) # btn.bind("Button-",self.button_clicked) # i=i+1 btn = Button(self, text="Кнопка", width=10, command=self.button_clicked) btn.grid(row=1, column=0) #btn.bind("Button-1",self.button_clicked) print("end UI") def main(): root = Tk() root.geometry("1500x900") #root.textvar=root.StringVar() app = Calculator(root) root.mainloop() if __name__ == "__main__": print("start") main()
Офлайн
Не обманывайте. Вы не этот код выполняете. Вы пытаетесь повесить на событие в качестве обработчика результат выполнения функции, а не объект функции.
btn = Button(self, text=“Кнопка”, width=10, command=self.button_clicked(btn))
btn = Button(self, text=“Кнопка”, width=10, command=lambda event: self.button_clicked(btn))
Офлайн
Сделал вот так:
btn = Button(self, text="Кнопка", width=10, command=lambda event: self.button_clicked(btn))
def button_clicked(self,event): print("event") self.output.delete("0.0","end") self.output.insert("0.0","sdfdsfsd")
btn = Button(self, text="Кнопка", width=10, command=self.button_clicked)
def button_clicked(self): print("event") self.output.delete("0.0","end") self.output.insert("0.0","sdfdsfsd")
Офлайн
А, спасибо, понял сам, ссылку на еще не созданную кнопку видимо нельзя передавать, надо так:
btn = Button(self, text="Кнопка", width=10, command=lambda: self.button_clicked(1))
def button_clicked(self, event): print("event") print(event) self.output.delete("0.0","end") self.output.insert("0.0","sdfdsfsd")
Офлайн
Зато не получается так сделать:
def setUI(self): print("UI") self.pack(fill=BOTH, expand=1) self.output=Text(self, height=1, width=25) self.output.grid(row=0, column=0, columnspan = 5) i=0 currow=1 while i<=9: if i>=5: currow=2 btn = Button(self, text=i, width=3, command=lambda: self.button_clicked(i)) btn.grid(row=currow, column=i % 5) #btn.bind("Button-",self.button_clicked) i=i+1 #btn = Button(self, text="Кнопка", width=10, command=lambda: self.button_clicked(1)) #btn.grid(row=1, column=0) #btn.bind("Button-1",self.button_clicked) print("end UI")
Офлайн
Это фокус lambda. Описывайте явно.
btn = Button(self, text=i, width=3, command=lambda i=i: self.button_clicked(i))
Офлайн
Ну и вообще не надо это передавать.
Попробуйте в функции обработчике
# def button_clicked(self, event): print(event.widget["text"])
Офлайн
Спасибо большое.
Вот так работает:
btn = Button(self, text=i, width=3, command=lambda i=i: self.button_clicked(i))
Офлайн
А Вы не передавайте ничего Event валится в функцию при использовании bind по-умолчанию. На command его не будет.
Вот
Button(self, text=i, width=3).bind("<Button-1>", button_clicked)
Отредактировано 4kpt_IV (Янв. 25, 2017 08:18:53)
Офлайн