The following program simulates a traffic light system with some buttons. The buttons appear correctly, but if I'm trying to call the method to create/change the LEDs, it ends up in the wrong method. Here's the important part of the code:
class GUI (threading.Thread):
def __init__(self, num):
threading.Thread.__init__(self)
def run(self):
global window
window = Tk()
window.title('Ampel GUI')
window = Canvas(window, width=400, height=200)
window.pack()
button1 = Button(window, text="Press", command=lambda: pushbutton(25))
button1.pack()
button1.place(x=190, y=70)
button2 = Button(window, text="Press", command=lambda: pushbutton(12))
button2.pack()
button2.place(x=115, y=160)
(...)
button6 = Button(window, text="V2", command=lambda: pushbutton(22)) # V2
button6.pack()
button6.place(x=280, y=130)
window.mainloop()
@staticmethod
def output(self, lampe, status):
if status == 0:
if lampe == 21:
window.create_oval(140, 30, 160, 10, fill="#FFA6A6")
if lampe == 20:
window.create_oval(170, 30, 190, 10, fill="#FAFAAA")
callthread=GUI()
callthread=threading.Thread(target=GUI.output, args=(21,0))
callthread.start()
How do I fix the callthread-part, so that the output method is called with the arguments (21,0)? Right now all that it ends up with is
TypeError: __init__() takes exactly 2 arguments (1 given)
//edit: This is how the fixed version looks like:
class GUI (threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
global window
window = Tk()
window.title('Ampel GUI')
window = Canvas(window, width=400, height=200)
window.pack()
button1 = Button(window, text="Press", command=lambda: pushbutton(25))
button1.pack()
button1.place(x=190, y=70)
button2 = Button(window, text="Press", command=lambda: pushbutton(12))
button2.pack()
button2.place(x=115, y=160)
(...)
button6 = Button(window, text="V2", command=lambda: pushbutton(22)) # V2
button6.pack()
button6.place(x=280, y=130)
window.mainloop()
@staticmethod
def output(lampe, status):
if status == 0:
if lampe == 21:
window.create_oval(140, 30, 160, 10, fill="#FFA6A6")
if lampe == 20:
window.create_oval(170, 30, 190, 10, fill="#FAFAAA")
callthread=GUI()
callthread=threading.Thread(target=GUI.output, args=(21,0))
callthread.start()
See Question&Answers more detail:
os