liuhongrun2022 发表于 2023-2-22 21:29:49

多线程的问题

我写了一个 tk 窗口,打算点击按钮的时候派生子线程执行任务.
求求各位大神给下代码或者实现的思路吧
(除了最佳答案还会给鱼币)
@isdkz @歌者文明清理员 @学习编程中的Ben @tommyyu
(暂时给不了 tkinter 窗口的代码,因为在用手机)

isdkz 发表于 2023-2-22 21:37:26

本帖最后由 isdkz 于 2023-2-23 08:27 编辑

像这样子?

from tkinter import *
from threading import Thread
from time import sleep

def task(s):
    while True:
      print(f'执行{s}')
      sleep(2)
root = Tk()
b1 = Button(text="派生子线程", command=lambda: Thread(target=task, args=("任务一",)).start())
b1.pack()
mainloop()

歌者文明清理员 发表于 2023-2-22 22:12:45

我因为审核已经私信作者
https://fishc.com.cn/thread-224588-1-2.html

歌者文明清理员 发表于 2023-2-23 07:23:34

isdkz 发表于 2023-2-22 21:37
像这样子?

不对
这样重复点击按钮会报错
应该
def func():
    Thread(target=task, args=[]).start()# 这样每次都声称一个不同的Thread
def task():
    pass
button['command'] = func

isdkz 发表于 2023-2-23 08:24:57

歌者文明清理员 发表于 2023-2-23 07:23
不对
这样重复点击按钮会报错
应该

好吧,是我疏忽了

liuhongrun2022 发表于 2023-2-24 18:20:04

isdkz 发表于 2023-2-22 21:37
像这样子?

感谢大佬
就是任务执行过后会报一个
RuntimeError: Calling Tcl from different apartment

isdkz 发表于 2023-2-24 18:22:12

liuhongrun2022 发表于 2023-2-24 18:20
感谢大佬
就是任务执行过后会报一个

你的代码方便放出来吗?我看看什么问题

liuhongrun2022 发表于 2023-2-24 20:05:30

isdkz 发表于 2023-2-24 18:22
你的代码方便放出来吗?我看看什么问题

库:
import os
from tkinter.messagebox as msgbox
from tkinter import *
from threading import Thread
from pdf2docx import Converter
函数的代码:
def pdf_to_word():
    try:
      pdffile = tf.askopenfilename(title='选择PDF文档') # 选择文件
      wordfile = os.path.splitext(pdffile) + '.docx'
      cv = Converter(pdffile)
      cv.convert(wordfile)
      cv.close()
      msgbox.show_info('转换成功!')
    except FileNotFoundError:
      msgbox.showerror('你没有选择任何文件!')
Button:
b2 = Button(root, text='pdf单文件转word', command=lambda: Thread(target=pdf_to_word).start())
b2.pack(side=LEFT, padx=5, pady=5, fill=BOTH)
这个任务执行完会报这个错误
因为直接用主进程执行完会未响应,然后等一会又好了
所以用子进程
页: [1]
查看完整版本: 多线程的问题