【问题标题】:Reading a variable, comparing to CSV data and outputting a row读取变量,与 CSV 数据进行比较并输出一行
【发布时间】:2016-02-17 00:40:22
【问题描述】:

我今天在让一些 CSV 文件正常工作方面完全崩溃了。下面是完整的代码以及 csv 文件的剪切和粘贴。 我正在尝试做的是在车间订单字段中输入一个与 CSV 第一列中的数字匹配的数字。当匹配到整行打印到大输出框时,第二部分将拆分 csv 字段,以便将数据输入到数量和描述字段中,但我可能应该先学会爬行。

我无法让 csv 显示在输出框中,我无法确定问题出在哪里,或者我是否缺少代码。

如果我删除 csv 代码,输入到车间订单框中的数字会打印到大输出框中,输入的任何字母都会显示一个运行良好的错误框,它只是下一个问题。

from tkinter import *
from tkinter import ttk
import sys
import csv
from csv import DictReader

class GUI:
def __init__(self, rootWindow):

    #variable
    sonumber = StringVar()
    result = int()

    #item1
    self.label = ttk.Label(rootWindow, text="Shop Order:")
    self.label.grid(row=1, column=1, sticky=(E), padx=3, pady=3)

    self.SOentry = ttk.Entry(rootWindow, width=5, background="white", textvariable = sonumber)
    self.SOentry.grid(row=1, column=2, sticky=(W, E), padx=3, pady=3) 
    #item2
    self.label2 = ttk.Label(rootWindow, text="Quantity:")
    self.label2.grid(row=1, column=3, sticky=(E), padx=3, pady=3)

    self.outputQty = Text(rootWindow, width=5, height=1, background="white")
    self.outputQty.grid(row=1, column=4, sticky=(W, E), padx=3, pady=3) 

    #item3
    self.label3 = ttk.Label(rootWindow, text="Description:")
    self.label3.grid(row=2, column=1, sticky=(E), padx=3, pady=3)

    self.outputDesc = Text(rootWindow, width=5, height=1, background="white")
    self.outputDesc.grid(row=2, column=2, columnspan=5, sticky=(W, E), padx=3, pady=3) 

    #output
    self.label4 = ttk.Label(rootWindow, text="Drawings:")
    self.label4.grid(row=3, column=1, sticky=(N,E), padx=3, pady=3)

    self.dwgoutputbox = Text(rootWindow, width=50, height=15, background="white")
    self.dwgoutputbox.grid(row=3, column=2, columnspan=5, padx=3, pady=3)
    sys.stdout = TextRedirector(self.dwgoutputbox, "printdwgoutputbox") #redirects from shell to screen

    #buttons
    def DoASearch():
        try:
            print(int(sonumber.get()))
        except ValueError:
            messagebox.showwarning("Fail !!", "Please enter a valid Shop Order number.")

        with open("lesspreadsheettest.csv") as csvfile:
            reader = csv.DictReader(csvfile)
            for row in reader:
                result=(row['Shop Order'])
                if sonumber == result:
                    print(row['Shop Order'], row['Part Number'], row['Description'])

    self.searchbutton = ttk.Button(rootWindow, text="Search", command=DoASearch)
    self.searchbutton.grid(row=1, column=7, sticky=W, padx=3, pady=3)


    def clear_text():
        self.SOentry.delete(0, 'end')

    self.clrsearchbutton = ttk.Button(rootWindow, text="Reset", command=clear_text)
    self.clrsearchbutton.grid(row=2, column=7, sticky=W, padx=3, pady=3)
    #

    self.exitbutton = ttk.Button(rootWindow, text="Exit", command=rootWindow.destroy)
    self.exitbutton.grid(row=3, column=7, sticky=(N,W), padx=3, pady=3)


class TextRedirector(object):
def __init__(self, widget, tag="printdwgoutputbox"):
    self.widget = widget
    self.tag = tag

def write(self, str):
    self.widget.configure(state="normal")
    self.widget.insert("end", str, (self.tag,))
    self.widget.configure(state="disabled")

def main():
global label   
rootWindow = Tk()
rootWindow.title("Production Drawings")
rootWindow.geometry("575x325+600+300")
gui = GUI(rootWindow)
rootWindow.mainloop()

main()

My test csv code is
Shop Order  Part Number Description Quantity
12345   5-1841111-1 Ferrari California  1
12346   5-1841222-2 Porsche 911 2
12347   5-1841333-3 Lamborghini Aventador   3
12348   5-1841444-4 Jaguar F-Type   4
12349   5-1841555-5 Bugatti Veyron  5

【问题讨论】:

  • 这看起来不像 csv 数据。你的文件里真的有逗号吗?您可以只打印搜索功能中的第一行吗?
  • 抱歉,显示的 csv 是从 excel 剪切和粘贴的,这可能是没有显示逗号的原因。搜索代码以“Def doasearch”开头,我包含了整个代码,以防有人想运行它

标签: python csv tkinter


【解决方案1】:

您的 sonumber 变量是 Tkinter StringVar,而不是普通的 Python 字符串。当您进行比较时:

if sonumber == result:
    print(row['Shop Order'], row['Part Number'], row['Description'])

您正在将 Tkinter StringVar 与字符串进行比较,因此它始终评估为 False。如果你改用sonumber.get(),你会得到实际值,你应该没有问题。

【讨论】:

  • 太棒了,这似乎已经解决了。谢谢@jdep,作为一个后续问题,您能否将打印的行拆分,以便车间订单、零件编号和描述打印到单独的输出框?
  • 我不完全确定您所说的“输出框”是什么意思,但是如果您将打印语句的每个元素分开,您可以一次处理一个。
  • 感谢 Jdep,我认为可能是这种情况,抱歉我的术语不正确,我指的是 3 个不同的文本小部件,我用它们来分割输出:)
  • 来自effbot.org/tkinterbook/text.htm:要将文本插入小部件,请使用 insert 方法并在 INSERT 或 END 索引处插入文本:text.insert(END, "hello")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多