首页 > 解决方案 > 如何为线程调用的函数提供参数

问题描述

import tkinter as tk
import threading
import time

def count(timeamt):
    time.sleep(timeamt)
    tk.Label(win, text='5 sec done').grid(row = 0, column = 1)

def start():
    t1 = threading.Thread(target=count, args=(5))
    t1.start()
    # count(5)
    tk.Label(win, text = 'started').grid(row = 1, column = 1)

win = tk.Tk()
win.geometry('200x200')

tk.Button(win, text = "hi", command = start).grid(row = 2, column = 5)

win.mainloop()

这是行不通的

Traceback (most recent call last):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
TypeError: count() argument after * must be an iterable, not int

标签: pythontkinter

解决方案


尝试这个:

import tkinter as tk
import time

def count():
    label = tk.Label(win, text="5 sec done")
    label.grid(row=0, column=1)

def start():
    # 5 sec = 5000 ms
    win.after(5000, count)
    label = tk.Label(win, text="started")
    label.grid(row=1, column=1)

win = tk.Tk()
win.geometry("200x200")

btn = tk.Button(win, text="hi", command=start)
btn.grid(row=2, column=5)

win.mainloop()

我删除了线程并win.after改为使用。有关该.after方法的更多信息,请阅读


推荐阅读