我对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()
所有故障都正常,当我尝试将其停止时会崩溃。
答案 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,它允许您在辅助线程中启动仿真,同时保持对主循环的控制。这样,您可以使用变量来跟踪仿真进度并采取相应的行动。