Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
393 views
in Technique[技术] by (71.8m points)

multithreading - Python function calls the wrong method/target

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Your error is on this line:

callthread=GUI()

The problem is that __init__ was defined as:

def __init__(self, num):

So either provide an argument when creating a GUI object, or remove the num argument from the __init__ method.

note: This answer applies to the code prior to your edit. After your edit you removed the num argument from __init__. You should no longer get the TypeError with your edited code.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...