Python只打印到cs中的一个单元格

2024-05-15 02:49:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为我正在制作的GUI制作一个打印按钮。现在,当我点击print按钮时,它会将所有数据存储到一个单元格中,每个变量都是我要打印的。现在我正在打印时间,转速,扭矩和马力。它会给我每个人在各自单独的牢房里,但不会开始新的一行。此单元格中的格式为:[1,2,3,4,5,…]。括号也在牢房里。我希望将它们分隔成行,这样GUI的用户就可以获取数据进行后期处理。在这个问题上,我发现人们试图把单词放到不同的单元格中,我知道字符的行为和数字不同,人们希望值在一个单元格中,而不是像我的例子那样相反。你知道吗

我现在拥有的是打印按钮将打印一个带有唯一时间戳的文件。这样,用户就可以保存这些数据,以确保安全。你知道吗

提前谢谢!你知道吗

"""
SCSU DYNO GUI PROGRAM

created 11/10/2017

"""


import sys
import time
from time import gmtime, localtime, strftime

import csv
import numpy as np
import warnings
import serial
import serial.tools.list_ports
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QThread,QTimer, pyqtSignal
from PyQt5.QtWidgets import QMessageBox,QWidget, QApplication,QHBoxLayout
from PyQt5.QtGui import QColor
from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg
import random
from DynoTest1 import Ui_DynoTest1


__author__ = 'Matt Munn'

pg.setConfigOption('background', None)
pg.setConfigOption('foreground', 'k')

class GetData(QThread):
    dataChanged = pyqtSignal(float, float, float, float, float, float, float, float)

    #Distance = 0.5 #This is dependent on the lever arm.

    def __init__(self, parent=None):
        QThread.__init__(self, parent)

        arduino_ports = [  # automatically searches for an Arduino and selects the port it's on
            p.device
            for p in serial.tools.list_ports.comports()
            if 'Arduino' in p.description
        ]

        if not arduino_ports:
            raise IOError("No Arduino found - is it plugged in? If so, restart computer.")
        if len(arduino_ports) > 1:
            warnings.warn('Multiple Arduinos found - using the first')
        self.Arduino = serial.Serial(arduino_ports[0], 9600, timeout=1)

    def __del__(self):  # part of the standard format of a QThread
        self.wait()

    def run(self):  # also a required QThread function, the working part
        self.Arduino.close()
        self.Arduino.open()

        self.Arduino.flush()
        self.Arduino.reset_input_buffer()
        start_time = time.time()

        Distance = 1 #This is dependent on the lever arm.
        Max_RPM = 0
        Max_Horsepower = 0
        Max_Torque = 0
#This is what does the work to get the data from the arduino and then converts it to the other needed values.
        while True:
            while self.Arduino.inWaiting() == 0:
                pass
            try:
                data = self.Arduino.readline()
                dataarray = data.decode().rstrip().split(',')
                self.Arduino.reset_input_buffer()
                Force = round(float(dataarray[0]), 3)
                RPM = round(float(dataarray[1]), 0)
                if Max_RPM < RPM:
                    Max_RPM = RPM
                Torque = round(Force * Distance, 2)
                if Max_Torque < Torque:
                    Max_Torque = Torque
                Horsepower = round(Torque * RPM / 5252, 2)
                if Max_Horsepower < Horsepower:
                    Max_Horsepower = Horsepower
                Run_Time = round(time.time() - start_time, 1)
                print(Force, 'Grams', ",", RPM, 'RPMs', ",", Torque, "ft-lbs", ",", Horsepower, "hp", Run_Time,
                      "Time Elasped")
                self.dataChanged.emit(Force, RPM, Max_RPM, Torque, Max_Torque, Horsepower, Max_Horsepower, Run_Time)
            except (KeyboardInterrupt, SystemExit, IndexError, ValueError):
                pass


class GUI(QWidget, Ui_DynoTest1):
    def __init__(self, parent=None, border = None):
# This is what is used to make the graph.        
        QWidget.__init__(self, parent)
        self.setupUi(self)
        self.thread = GetData(self)
        self.thread.dataChanged.connect(self.onDataChanged)
        self.thread.start()
        self.rpm = []
        self.torque = []
        self.horse_power = []
        self.time = []
        self.counter = 0

        layout = QHBoxLayout()
        self.plot = pg.PlotWidget()
        layout.addWidget(self.plot)
        self.plot.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
        self.graphicsView.setLayout(layout)

        self.p1 = self.plot.plotItem
        self.p1.setLabels(left='Torque (ft-lbs)', bottom= 'Time (sec)')
        self.TorqueCurve = self.p1.plot()
        self.TorqueCurve.setPen(pg.mkPen(QColor(0,0,0), width=2.5))

        self.p2 = pg.ViewBox()
        self.HorsePowerCurve = pg.PlotCurveItem()
        self.HorsePowerCurve.setPen(pg.mkPen(QColor(0, 0, 255), width=2.5))
        self.p2.addItem(self.HorsePowerCurve)
        self.p1.scene().addItem(self.p2)
        self.p1.showAxis('right')
        self.p1.getAxis('right').setLabel('HorsePower', color='#0000ff')
        self.p1.getAxis('right').linkToView(self.p2)
        self.p1.vb.sigResized.connect(self.updateViews)

#This is where the buttons will be set up at.
        self.pushButton_4.clicked.connect(self.Print_Out)

    def Print_Out(self):

        #This gives a unique time stamp for each file made.
        outputFileName = "DynoData_#.csv"
        outputFileName = outputFileName.replace("#", strftime("%Y-%m-%d_%H %M %S", localtime()))

        with open(outputFileName, 'w',newline='') as outfile:
            outfileWrite = csv.writer(outfile, delimiter=',')
            #test = self.torque
            #test2 = self.torque , self.rpm
            outfileWrite.writerow([self.torque,self.horse_power,self.rpm,self.time])

    def updateViews(self):
        self.p2.setGeometry(self.p1.vb.sceneBoundingRect())
        self.p2.linkedViewChanged(self.p1.vb, self.p2.XAxis)

    def onDataChanged(self, Force, RPM, Max_RPM, Torque, Max_Torque, Horsepower, Max_Horsepower, Run_Time):
#These tell the program to display the values to the LCDs
        self.lcdNumber.display(Max_RPM)
        self.lcdNumber_2.display(Max_Torque)
        self.lcdNumber_3.display(Max_Horsepower)
        self.lcdNumber_4.display(RPM)
        self.lcdNumber_5.display(Torque)
        self.lcdNumber_6.display(Horsepower)
        self.lcdNumber_7.display(Run_Time)

        if self.counter < 50:
            self.torque.append(Torque)
            self.horse_power.append(Horsepower)
            self.time.append(Run_Time)
            self.rpm.append(RPM)
        else:
            self.torque = self.torque[1:] + [Torque]
            self.horse_power = self.horse_power[1:] + [HorsePower]
            self.time = self.time[1:] + [Run_Time]
            self.rpm = self.rpm[1:] + [RPM]
        self.HorsePowerCurve.setData(self.time, self.horse_power)
        self.TorqueCurve.setData(np.array(self.time), self.torque)
        self.updateViews()

#This is part of a standard closing script

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    Dyno = GUI()
    Dyno.show()
    sys.exit(app.exec_())

Tags: thefromimportselftimeisfloatmax
2条回答

由于您的数据在列表中,因此需要为每个数据项实例形成行。一种方法是用zip来转置列表:

>>> hp = [1,2,3]
>>> rpm = [4,5,6]
>>> time = [7,8,9]
>>> for row in zip(hp,rpm,time):
...  print(row)
...
(1, 4, 7)
(2, 5, 8)
(3, 6, 9)

请注意如何打印每个列表中的第一个项目,然后打印第二个项目,以此类推。您可以使用它将数据放入行中。下面是一个独立的示例:

import csv

class Test:
    def __init__(self):
        self.torque = [10,20,30]
        self.horse_power = [100,200,300]
        self.rpm = [1000,2000,3000]
        self.time = [1,2,3]

    def print(self):
        with open('test.csv','w',newline='') as outfile:
            outfileWrite = csv.writer(outfile)
            outfileWrite.writerow('Torque HP RPM Time'.split())
            outfileWrite.writerows(zip(self.torque,self.horse_power,self.rpm,self.time))

t = Test()
t.print()

writerows(复数)。它需要一个列表列表。writerow(单数)需要一个列表,用于头。输出文件是:

Torque,HP,RPM,Time
10,100,1000,1
20,200,2000,2
30,300,3000,3

首先,不建议在python中调用定义print。除非你真的想超越python的“print”例如打印到csv。你知道吗

至于csv,你需要将你的数据分组到[扭矩,马力,转速,时间]的列表中,这样你的it看起来就像这样

data_lists = [
   [torque(0), horsepower(0), rpm(0), time(0)],
   [torque(1), horsepower(1), rpm(1), time(1)],
   ...
   [torque(n), horsepower(n), rpm(n), time(n)]
]

然后你会循环浏览这个数据列表,然后像这样一行一行地打印出来

for d in data_datalist:
   outfileWrite.writerow([d[0],d[1],d[2],d[3])

当然,有很多方法可以构造数据,这只是一个例子。你知道吗

希望这有帮助。你知道吗

相关问题 更多 >

    热门问题