【问题标题】:Passing arguments to threading. Arguments originate from input in tkinter GUI将参数传递给线程。参数源自 tkinter GUI 中的输入
【发布时间】:2021-01-06 11:34:49
【问题描述】:

我正在编写一个使用 GUI 运行的脚本。 有两个输入字段和两个按钮,我正在使用threading,所以我可以使用按钮启动和停止循环而不会冻结。 输入对于循环中的某些操作是必需的,我将简化它们,因为它是一个很长的if 语句。

我从未做过线程,该应用程序在我尝试实现它之前就已经工作了。 主要问题是如何将来自 GUI 的输入传递给线程? 它一直给我argument not defined 错误。

这是代码,非常感谢您的帮助:

global x
global y

def scriptOne(x, y):
      print(x)
      print(y)

      while True:
        if pyautogui.locateOnScreen('agree.png', confidence=0.85) != None:
             print("Here are x&y: ", x, y)
        else:
             time.sleep(2)
             print("Waiting")

threadx=  threading.Thread(target=scriptOne, args=(x, y))

root = tkinter.Tk()

canvas = tkinter.Canvas(root, height=(heightR*.2), width=(widthR*.2), bg="#26292c")
canvas.pack()
frame= tkinter.Frame(root, bg="#26292c")
frame.place(relx=.1, rely=.1, relwidth=.8, relheight=.8)

xEntry=tkinter.Entry(frame, bg='#c5c7c4')
xEntry.place(relx=.4, rely=.05, relwidth=.75, relheight=.15)

yEntry=tkinter.Entry(frame, bg='#c5c7c4')
yEntry.place(relx=.4, rely=.3, relwidth=.75, relheight=.15)

labelX = tkinter.Label(frame, text="Pick", padx=1, pady=1, fg="white", bg="#26292c")
labelX.place(relx=0, rely=.05, relwidth=.25, relheight=.15)

labelY = tkinter.Label(frame, text="Ban", padx=1, pady=1, fg="white", bg="#26292c")
labelY.place(relx=0, rely=.3, relwidth=.25, relheight=.15)

startScript=tkinter.Button(frame, text="Activate Script", padx=10, pady=5, fg="white", bg="#52595d", command= lambda: threadx.start(xEntry.get(),yEntry.get()))
startScript.place(relx=.05, rely=.8, relwidth=.4, relheight=.2)

endScript=tkinter.Button(frame, text="Quit Script", padx=10, pady=5, fg="white", bg="#52595d", command=exit)
endScript.place(relx=.55, rely=.8, relwidth=.4, relheight=.2)

root.mainloop()

【问题讨论】:

  • 您的xy 是什么,在您给出的示例中未定义

标签: python python-3.x multithreading tkinter infinite


【解决方案1】:

最好创建另一个函数来创建Thread 实例并启动它:

def start_thread():
    # make sure x and y are input correctly
    try:
        x = int(xEntry.get().strip())
        y = int(yEntry.get().strip())
    except ValueError:
        print('Invalid x or y value')
        return

    # disable the button which is associated with this function
    startScript.config(state='disabled')

    # create thread and start it
    threading.Thread(target=scriptOne, args=(x,y), daemon=True).start()

然后将上述函数分配给startScript按钮:

startScript = tkinter.Button(frame, text="Activate Script", padx=10, pady=5,
                             fg="white", bg="#52595d", command=start_thread)

【讨论】:

    猜你喜欢
    • 2011-02-18
    • 2015-03-08
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多