2016-02-02 65 views
1

我正在構建一個設備,該設備計算從機器製造多少部件,然後關閉特定數量的機器。我使用Arduino進行所有I/O工作,然後將串行數據作爲變量partCount導入Python。我想在tkinter中創建一個簡單的GUI來顯示已經制作的部件數量和所需的總數量。問題是我不斷收到包含變量而不是文本的標籤行上的錯誤。我對此做了很多研究,但由於某些原因我無法獲得。任何意見,將不勝感激。tkinter窗口中的Python變量

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) 

使用Python變量的Tkinter需要特殊Tk的對象,其中有四種:BooleanVarDoubleVarIntVar,並StringVar。例如this answer就是一個很好的例子。

+0

在變量獲取所有信息到窗口之前添加「text =」。我唯一剩下的問題是我希望窗口中的數字隨着程序中變量的變化而改變。它現在只是零。我不知何故需要在tkinter窗口中獲取變量,以便在Python中更新時更新 – shark38j

+0

@ shark38j:已更新的答案。 –

+1

@ shark38j您可以使用帶有StringVar的文本變量選項作爲Ethan建議的並且如鏈接答案中所示。或者您可以使用文本選項並使用'partNumberInfo ['text'] = int_as_string'進行更新。不要使用這兩個選項。 –

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()