微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将参数传递给线程参数源自tkinter GUI中的输入

如何解决将参数传递给线程参数源自tkinter GUI中的输入

我正在编写一个可与​​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,relheight=.15)

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

labelY = tkinter.Label(frame,text="Ban",bg="#26292c")
labelY.place(relx=0,relheight=.15)

startScript=tkinter.Button(frame,text="Activate Script",padx=10,pady=5,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",command=exit)
endScript.place(relx=.55,relheight=.2)

root.mainloop()

解决方法

更好地创建另一个函数来创建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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。