python - tkinter:RuntimeError:线程只能启动一次
问题描述
但是我正在尝试为我的脚本制作 GUI,当我单击时bt_send
我启动了一个线程(thread_enviar
),该线程也启动了其他线程(core
),问题是它thread_enviar
一直在运行,所以当我尝试单击时出现此错误bt_send
再次:
文件“/anaconda3/envs/tensor/lib/python3.6/threading.py”,第 842 行,在 start raise RuntimeError("threads can only be started once") RuntimeError: 线程只能启动一次
我的代码:
import tkinter as tk
from tkinter import filedialog
import pandas as pd
from tkinter import messagebox
from tkinter import ttk
import threading
import rnn10forecasting as rnn10f
filepath = ""
model = ""
'''def change_menu(selection):
global model
selected = selection
print(selected)
model = selected'''
def click():
global filepath
print("click")
filepath = filedialog.askopenfilename(initialdir = "/",title = "Select file",filetypes = (("data files","*.csv"),("all files","*.*")))
print(filepath)
label_filepath.config(text = filepath)
def enviar():
print(filepath)
try:
data = pd.read_csv(filepath)
except:
messagebox.showerror("Error", "Archivo .csv vacio o formato incompatible")
if any(data.columns.values != ['date','close','volume','open','high','low']):
messagebox.showerror("Error", "El archivo .csv no contiene la estructura requerida: [date,close,volume,open,high,low]")
elif len(data) < 300:
print("# registros")
print(len(data))
messagebox.showerror("Error", "El archivo de be contener como minimo 700 registros")
else:
pg_bar.start(500)
core = threading.Thread(target=rnn10f.forecasting, args=(filepath,))
#core.daemon = True
core.start()
core.join()
print("VIVO?")
print(core.isAlive())
pg_bar.stop()
return print(thread_enviar.is_alive())
thread_enviar = threading.Thread(target=enviar, args=())
window = tk.Tk()
window.resizable(width=False, height=False)
window.title("LSTM Module")
window.geometry("600x150")
title = tk.Label(text="StockForecaster", font=("Times New Roman", 30))
title.place(relx=0.1, rely=0.05, relwidth=0.8, relheight=0.25)
bt_select = tk.Button(text="Select File", bg="blue", command= click)
bt_select.place(relx=0.7, rely=0.4, relwidth=0.25, relheight=0.2)
label_filepath = tk.Label(text="Please select a .csv File")
label_filepath.place(relx=0, rely=0.4, relwidth=0.7, relheight=0.15)
options = tk.StringVar()
bt_send = tk.Button(text="Send", bg="blue", command=thread_enviar.start)
bt_send.place(relx=0.70, rely=0.7, relwidth=0.25, relheight=0.20)
pg_bar = ttk.Progressbar(window, orient= tk.HORIZONTAL, mode="indeterminate", )
pg_bar.place(relx=0.10, rely=0.75, relwidth=0.55, relheight=0.05)
window.mainloop()
我不知道是否有任何方法可以杀死该线程或者我做错了什么。
解决方案
问题:RuntimeError:线程只能启动一次
据我了解,您不想运行多个threads
,只想在 a 中执行一个任务thread
以避免冻结Tk().mainloop()
.
要禁止,要thread
在前一个thread
仍在运行时开始新的,您必须disable
验证Button
或验证前一个thread
是否仍在.alive()
。
尝试以下方法:
import tkinter as tk
import threading, time
class Task(threading.Thread):
def __init__(self, master, task):
threading.Thread.__init__(self, target=task, args=(master,))
if not hasattr(master, 'thread_enviar') or not master.thread_enviar.is_alive():
master.thread_enviar = self
self.start()
def enviar(master):
# Simulating conditions
if 0:
pass
#if any(...
#elif len(data) < 300:
else:
#master.pg_bar.start(500)
# Simulate long run
time.sleep(10)
#rnn10f.forecasting(filepath)
print("VIVO?")
#master.pg_bar.stop()
class App(tk.Tk):
def __init__(self):
super().__init__()
bt_send = tk.Button(text="Send", bg="blue",
command=lambda :Task(self, enviar))
if __name__ == "__main__":
App().mainloop()
推荐阅读
- java - 更新 sqlite db 并获取 nullpointerexception
- python - 如何在其他类中使用 super() 调用同一类两次?
- javascript - ReactJs 中的嵌套 URL 路由
- ios - 如何撤消`-FIRAnalyticsDebugEnabled`?
- javascript - tensorflow 如何对大于 32 位的整数数据进行基本数学运算?
- node.js - 如何使用 .env 存储用于 JWT 的 JSON 密钥?
- javascript - 有没有办法在画布上渲染动画透明 gif 并更改帧之间的延迟
- ios - 如何在移动设备上设置 ionic-segment-button 的样式,使其看起来像是在 Chrome 浏览器中呈现的?
- oracle - PLSQL:如何使用变量作为 table_name 创建游标
- jquery - jquery复制到剪贴板