【发布时间】:2016-02-08 17:10:38
【问题描述】:
我想让一个函数在 tkinter GUI 中连续运行。我附上了一些shell代码:
#!/usr/bin/env python3
import tkinter as tk
from time import sleep
import os
import sys
class Application(Frame):
def __init__(self, master):
super(Application, self).__init__(master)
self.grid()
self.create_widgets()
def create_widgets(self):
......
root = Tk()
def run_continously:
... -- calls sleep -- ...
root.after(3000, run_continuously)
root.geometry('%dx%d+%d+%d' % (w, h, x, y))
app = Application(root)
root.after(3000, run_continuously)
root.mainloop()
在运行 GUI 时,它往往会运行一次“run_continuously”函数,然后 GUI 就会死机。我怀疑这是由于 sleep 函数(我在 run_continuously 函数中调用的)
我将如何在一个非常简单的线程中实现“run_continuously”函数来解决这个问题?在线程中运行该函数甚至可以解决问题吗? “run_continuously”函数根本不需要与 Application 类交互。我希望它只是在后台运行并在主循环完成时停止。
代码到此结束:
def run_continuously(quit_flag):
print("in it")
if not quit_flag:
GPIO.output(DIR_PIN, True)
for i in range(steps):
print("in loop")
GPIO.output(STEP_PIN, True)
sleep(sDelay)
GPIO.output(STEP_PIN, False)
sleep(sDelay)
sleep(wait_time)
GPIO.output(DIR_PIN, False)
for i in range(steps):
GPIO.output(STEP_PIN, True)
sleep(sDelay)
GPIO.output(STEP_PIN, False)
sleep(sDelay)
print("run motor")
root.after(1000, run_continuously(quit_flag,))
#=================================================================
# main
#=================================================================
root = Tk() # Create the GUI root object
press1 = StringVar()
press2 = StringVar()
x = 275
y = 50
w = 580
h = 250
root.geometry('%dx%d+%d+%d' % (w, h, x, y))
app = Application(root) # Create the root application window
quit_flag = False
root.after(0, app.read_pressure)
motor_thread = threading.Thread(target=run_continuously, args=(quit_flag,)).start()
root.mainloop()
quit_flag=True
motor_thread.join()
【问题讨论】:
-
你为什么在
run_continuously中调用睡眠?这有什么用? -
为什么不试试
import threading并创建一个threading.Thread来运行run_continuously? -
连续运行功能输出值来控制步进电机。它使用睡眠功能,但不是唯一的。
-
David - 我试过了,run_continuously 函数只执行了一次:
-
root.after是time.sleep的传统知识等效项。在 tk 线程中,不要使用sleep。由于您的代码不是 MCVE,google.com/search?q=mcve&ie=utf-8&oe=utf-8,因此不可能对您的代码进行试验以确定哪里出了问题。如果您需要在run_continuously内暂停,那么您可能需要将其分解为子函数以使用 root.after 进行暂停。
标签: python multithreading user-interface tkinter