tkinter窗口中的Python变量

时间:2016-02-02 05:36:15

标签: python-3.x tkinter

我正在构建一个设备,用于计算从机器制造的部件数量,然后以特定数量关闭机器。我使用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)

2 个答案:

答案 0 :(得分:0)

您可以为Label窗口小部件提供多种选项,因为see here可以。您应该在第一个名称之后指定所有参数:

partNumberInfo = tkinter.Label(window, text=PartNumber)

要在Tkinter中使用Python变量,您需要特殊的Tk对象,其中有四个:BooleanVarDoubleVarIntVarStringVar。请参阅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()