【发布时间】:2018-04-16 17:52:16
【问题描述】:
我有两个文件。我们称它为 file_X.py 和 file_Y.py。两者都有从 COM 端口连续读取数据的无限循环。我有一个 tkinter 模块,它有两个按钮来启动 file_X 和 file_Y。因此,如果我单击按钮 A,我希望 file_X 运行,而按钮 B 将启动 file_Y。如何并行运行这些文件并让它们在各自的命令提示符终端中显示数据?
我尝试使用 runpy 和 os.system。 os.system 会给我一个错误,即使这两个文件的模块都可以自己正常工作。另一方面,runpy 不允许我在第一个模块运行时单击另一个按钮。
Tkinter 模块:
import tkinter as tk
import time
import runpy
root = tk.Tk()
root. title("App")
root.geometry('700x500')
v = tk.IntVar()
v.set(-1)
button_labels = [
(" Device 1 "),
(" Device 2 ")]
def ShowChoice():
choice = v.get() + 1
if(choice == 1):
runpy.run_module('file_X', run_name='__main__')
elif(choice == 2):
runpy.run_module('file_Y', run_name='__main__')
tk.Label(root,
text="""Choose the device you want to launch:""",
font = 'Arial 20 bold',
justify = tk.LEFT,
height = 6,
padx = 20).pack()
for val, button_label in enumerate(button_labels):
tk.Radiobutton(root,
text = button_label,
font = 'Times 12 bold',
indicatoron = 0,
bg = 'cornflower blue',
width = 40,
padx = 20,
pady = 5,
variable=v,
command=ShowChoice,
value=val).pack(anchor=tk.S)
root.mainloop()
file_X 和 file_Y 的代码几乎相同,但连接到不同的 COM 端口并具有不同的字符串修改。
import serial
import time
import csv
try:
ser = serial.Serial("COM4",
baudrate=2400,
bytesize=serial.EIGHTBITS,
parity =serial.PARITY_ODD)
except:
print("Device not detected")
def Reader():
global ser
try:
data = ser.readline().decode('utf-8')
data = str(data).replace("\r\n","")
data = data.replace("\x000","")
return data
except:
return "Data Unavailable"
def Start():
date_now = time.strftime('%d.%m.%y')
time_now = time.strftime('%H.%M.%S')
file_name = date_now + '__' + time_now + '.csv'
with open(file_name, 'w+') as f:
csv_file = csv.writer(f)
csv_file.writerow(['DATE','TIME','VALUE'])
while True:
date_now = time.strftime('%d/%m/%y')
time_now = time.strftime('%H:%M:%S')
data = Reader()
csv_file.writerow([date_now, time_now, data])
print([date_now, time_now, data])
if __name__ =='__main__':
Start()
【问题讨论】:
-
我们需要一些示例代码来使用。请提供Minimal, Complete, and Verifiable example。您可能需要研究多线程。假设您的 2 个
py文件在同一个文件夹中,您可以像导入库一样导入它们。import _X as x或类似的东西。然后通过引用它的名字来执行里面的代码,比如x.some_function_name(arguments)。 -
@Mike-SMT 我尝试使用多线程和多处理,但在这两种情况下它一直在抛出 serialExceptions
-
让这些脚本并行运行(我知道)的唯一方法是通过多线程。否则一次只能运行一个。
标签: python-3.x tkinter executable pyserial