我正在构建一个设备,用于计算从机器制造的部件数量,然后以特定数量关闭机器。我使用Arduino进行所有I / O工作,然后将串行数据作为变量partCount导入Python。我想在tkinter中创建一个简单的GUI来显示已经制作的部件数量和所需的总数量。问题是我一直在包含变量而不仅仅是文本的标签行上出现错误。我已经对它进行了大量的研究,但由于某些原因我无法得到它。任何建议将不胜感激。
import serial
import csv
import datetime
import tkinter
#Part Variables
partNumber = "A-33693" #Part Number
stockupTotal = 10
arduinoSerialData = serial.Serial('com3',9600) #Serial Variable
now = datetime.datetime.now()
#GUI
window = tkinter.Tk()
window.title("Troy Screw Products")
titleLabel = tkinter.Label(window, text="Davenport Machine Control")
partNumberLabel = tkinter.Label(window, text="Part #:")
stockUpTotalLabel = tkinter.Label(window, text="Stockup Total:")
partCountLabel = tkinter.Label(window, text="Current Part Count:")
partNumberInfo = tkinter.Label(window, partNumber)
stockUpTotalInfo = tkinter.Label(window, stockupTotal)
partCountInfo = tkinter.Label(window, partCount)
titleLabel.pack()
partNumberLabel.pack()
partNumberInfo.pack()
stockUpTotalLabel.pack()
stockUpTotalInfo.pack()
partCountLabel.pack()
partCountInfo.pack()
window.mainloop()
#Write to CSV File
def writeCsv():
with open("machineRunData.csv", "a") as machineData:
machineDataWriter = csv.writer(machineData)
machineDataWriter.writerow([partNumber, "Stockup Complete",now.strftime("%Y-%m-%d %H:%M")])
machineData.close()
#Serial Import
while (1==1):
if (arduinoSerialData.inWaiting()>0):
partCount = arduinoSerialData.readline()
partCount = int(partCount)
if partCount == 999999:
writeCsv()
print(partCount)
答案 0 :(得分:0)
您可以为Label
窗口小部件提供多种选项,因为see here可以。您应该在第一个名称之后指定所有参数:
partNumberInfo = tkinter.Label(window, text=PartNumber)
要在Tkinter中使用Python变量,您需要特殊的Tk对象,其中有四个:BooleanVar
,DoubleVar
,IntVar
和StringVar
。请参阅this answer以获取一个好例子。
答案 1 :(得分:0)
经过上周的大量研究后,我找到了解决方案。问题是该程序将运行GUI,但在GUI窗口关闭之前不会运行串行导入的代码。我需要一种方法来同时运行和更新GUI并同时导入串行数据。我通过为两个操作创建一个线程来解决这个问题。这可能是一种更简单的方法,但这就是我提出的方法。对于遇到类似问题的人,代码如下所示。
import serial
import time
import threading
from tkinter import *
#Part Variables
partNumber = "A-33693" #Part Number
stockupTotal = 10
partCount = 0
def countingModule():
global partCount
while (1==1):
time.sleep(2)
partCount += 1
print(partCount)
def gui():
global partCount
root = Tk()
pc = IntVar()
pc.set(partCount)
titleLabel = Label(root, text="Machine Control")
partNumberLabel = Label(root, text="Part #:")
stockUpTotalLabel = Label(root, text="Stockup Total:")
partCountLabel = Label(root, text="Current Part Count:")
partNumberInfo = Label(root, text=partNumber)
stockUpTotalInfo = Label(root, text=stockupTotal)
partCountInfo = Label(root, textvariable=pc)
titleLabel.pack()
partNumberLabel.pack()
partNumberInfo.pack()
stockUpTotalLabel.pack()
stockUpTotalInfo.pack()
partCountLabel.pack()
partCountInfo.pack()
def updateCount():
pc.set(partCount)
root.after(1, updateCount)
root.after(1, updateCount)
root.mainloop()
op1 = threading.Thread(target = countingModule)
op2 = threading.Thread(target = gui)
op1.start()
op2.start()