使用停止按钮时程序崩溃

时间:2019-07-09 12:30:14

标签: python tkinter

我对python还是很陌生,但是我在MATLAB中有一个有效的版本,但是却很难使开始/停止按钮在python中工作。

我已尽我所能简化了下面发布的代码,但基本上我想运行一系列的提示以进行适应性测试。为了表示不同的运动强度,必须按一定顺序发出哔哔声。

我已经使用函数编写了不同类型的练习(为了节省空间,我没有在下面的代码中包含所有练习),然后使用另一个函数将它们组合为所需的协议。然后,我创建了用于启动和停止协议运行的按钮。

我要包括的唯一内容不是在我已经尝试过的示例中,它必须包含一个计时器。练习部分的长度是可变的,但需要适合一个时间段,而不是一定的迭代次数。

我已经在网站上尝试了几种答案,我认为是最接近我的问题的答案; Previous Answer Mike在这里发布的第一个解决方案-SMT可以在我的PC上运行,它看起来也很像我想要达到的目标,但是我已经尽力将其匹配,但是开始按钮仍然保持按下状态,并且停止按钮崩溃了工作。

# Import all modules    
import time
import winsound
import tkinter

# Define Global Variables    
runTime = 20
numberBlocks = 5
atime = 1
tracker = False

# Define Movement Functions    
def walk()    
def jog()    
def cruise()    
def sprint()    
def ar()    
def rest()

# callback functions    
def start():
    global numberBlocks, runTime, atime, tracker
    tracker = False
    t = time.time()
    i = 0
    while i < numberBlocks - 1 and tracker == False:
        while (time.time() - t) < runTime and tracker == False:
            if tracker == False and (time.time() - t) < runTime:
                walk()
            if tracker == False and (time.time() - t) < runTime:
                sprint()
            if tracker == False and (time.time() - t) < runTime:
                ar()
            if tracker == False and (time.time() - t) < runTime:
                jog()
            if tracker == False and (time.time() - t) < runTime:
                cruise()
        rest()
        i += 1

def stop():
    global tracker
    tracker = True

# run GUI    
root = tkinter.Tk()
tracker = False
root.title('LIST')

# create all of the main containers    
bottom_center_frame = tkinter.Frame(root)
bottom_center_frame.pack(side="top", fill="x")

# create widgets for the button frame    
button_stop = tkinter.Button(bottom_center_frame, text='Stop', command=stop).pack(side="bottom", fill="x")
button_start = tkinter.Button(bottom_center_frame, text='Start', command=start).pack(side="bottom", fill="x")

# loop gui    
root.mainloop()

所有故障都正常,当我尝试将其停止时会崩溃。

1 个答案:

答案 0 :(得分:0)

因此,这里的主要问题是,一旦单击开始并在主循环中启动命令,public class CurrencyTextWatcher implements TextWatcher { boolean mEditing; Context context; public CurrencyTextWatcher() { mEditing = false; } public synchronized void afterTextChanged(Editable s) { if(!mEditing) { mEditing = true; String digits = s.toString().replaceAll("\\D", ""); NumberFormat nf = NumberFormat.getCurrencyInstance(); nf.setMinimumFractionDigits(3); try{ String formatted = nf.format(Double.parseDouble(digits)/1000); s.replace(0, s.length(), formatted); } catch (NumberFormatException nfe) { s.clear(); } mEditing = false; } } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { } } 将等待该命令结束,然后再允许您执行其他操作(在这种情况下,请按Stop) 。
可能的解决方案是像这样使用tkinter

.after()

单击开始时,将跟踪器设置为False,然后调用move函数,该函数将打印“ walking”。
然后import tkinter as tk class FitnessApp(tk.Tk): def __init__(self, tracker): tk.Tk.__init__(self) self.runTime = 20 self.numberBlocks = 5 self.atime = 1 self.tracker = tracker # create all of the main containers self.bottom_center_frame = tk.Frame(self) self.bottom_center_frame.pack(side="top", fill="x") # create widgets for the button frame self.button_stop = tk.Button(self.bottom_center_frame, text='Stop', command=self.stop) self.button_stop.pack(side="bottom", fill="x") self.button_start = tk.Button(self.bottom_center_frame, text='Start', command=self.start) self.button_start.pack(side="bottom", fill="x") def walk(self): print("walking") def start(self): self.tracker = False self.move() def stop(self): print("Stopping run") self.tracker = True def move(self): if self.tracker is False: self.walk() self.after(1000, self.move) # run GUI tracker = False root = FitnessApp(tracker) root.title('LIST') # loop gui root.mainloop() 每隔1000毫秒递归调用一次移动功能,您可以按一下停止按钮,将跟踪器设置为“真”,然后停止模拟。

对于更复杂的情况,我建议您使用threading module,它允许您在辅助线程中启动仿真,同时保持对主循环的控制。这样,您可以使用变量来跟踪仿真进度并采取相应的行动。