在Tkinter GUI中打印变量

时间:2018-07-27 22:25:34

标签: python pandas csv variables tkinter

这是我的代码:

import pandas as pd

from tkinter import *

master = Tk()

label1= Label(master, text='Department')
label1.grid(row=0, column=0)

textBox = Text(master, height=1, width=10)
textBox.grid(row=0, column=1)

def retrieve_input():
    Department = textBox.get("1.0","end-1c") 

    fileread = pd.read_csv('50.csv', encoding='latin-1')
    filevalue = fileread.loc[fileread['Customer'].str.contains(Department, na=False)]    



    def printSomething():
        label = Label(master, textvariable=filevalue)
        label.grid(row=3, column=1) 



button1 = Button(master,text="Show Values", command=lambda: retrieve_input())
button1.grid(row=2, column=1)

mainloop( )

我一直在Stack Overflow周围搜索如何执行此操作,直到现在为止都可以构建我的代码。但是,当我单击Show values按钮时,什么也没有发生。我找不到在线帮助解决此问题的地方。我的代码有根本上的错误吗?使用Python 3.7

2 个答案:

答案 0 :(得分:2)

您定义了一个嵌套的printSomething函数,该函数将显示某些内容,但是您从不调用该函数。

这将解决该问题:

def retrieve_input():
    Department = textBox.get("1.0","end-1c") 

    fileread = pd.read_csv('50.csv', encoding='latin-1')
    filevalue = fileread.loc[fileread['Customer'].str.contains("Lam Dep", na=False)]    

    def printSomething():
        label = Label(master, textvariable=filevalue)
        label.grid(row=3, column=1) 

    printSomething()

但是我不确定为什么首先需要该功能。您可以这样做:

def retrieve_input():
    Department = textBox.get("1.0","end-1c") 

    fileread = pd.read_csv('50.csv', encoding='latin-1')
    filevalue = fileread.loc[fileread['Customer'].str.contains("Lam Dep", na=False)]    

    label = Label(master, textvariable=filevalue)
    label.grid(row=3, column=1) 

但是您还有第二个问题:您正在尝试设置textvariable=filevalue,但这没有任何意义。

textvariable必须是tkinter.StringVar实例,而不是普通的旧Python字符串。然后,您可以set StringVar来保存您的字符串。

    filevar = StringVar()
    filevar.set(filevalue)
    label = Label(master, textvariable=filevar)
    label.grid(row=3, column=1) 

…或不带tkinter变量而直接传递文本:

    label = Label(master, text=filevalue)
    label.grid(row=3, column=1) 

还有一个问题:每次调用retrieveInput时,它将创建一个新的Label并将其网格化到以前存在的任何东西之前,但是您永远不会删除旧的。因此,如果您一遍又一遍地按下按钮,将会有一大堆不可见的窗口小部件浪费资源。

将标签创建移至全局范围(如文本框和另一个标签),并在此函数中替换其文本,而不是每次都创建一个新标签,可能更有意义。

使用StringVar是最简单的方法:

# ...

textBox = Text(master, height=1, width=10)
textBox.grid(row=0, column=1)

fileVar = StringVar()
fileLabel = Label(master, textvariable=fileVar)
fileLabel.grid(row=3, column=1)

def retrieve_input():
    Department = textBox.get("1.0","end-1c") 

    fileread = pd.read_csv('50.csv', encoding='latin-1')
    filevalue = fileread.loc[fileread['Customer'].str.contains("Lam Dep", na=False)]    

    fileVar.set(filevalue)

# ...

您的代码中可能还存在其他错误,但是我认为,如果您修复了这三个错误,那么至少您将接近所有正常工作。

答案 1 :(得分:1)

考虑到您正在运行Python 3.7,下面的代码将解决您的问题:

fg

您正面临以下问题:

  1. 您正在定义一个永远不会调用的内部函数jobs

  2. 即使您正在呼叫import pandas as pd from tkinter import * master = Tk() label1= Label(master, text='Department') label1.grid(row=0, column=0) textBox = Text(master, height=1, width=10) textBox.grid(row=0, column=1) def retrieve_input(): global text department = textBox.get("1.0","end-1c") fileread = pd.read_csv('50.csv', encoding='latin-1') filevalue = fileread.loc[fileread['Customer'].str.contains("Lam Dep", na=False)] text.set(filevalue) button1 = Button(master,text="Show Values", command=retrieve_input) button1.grid(row=2, column=1) text = StringVar() label = Label(master, textvariable=text) label.grid(row=0, column=1) mainloop() ,每次按printSomething时也要创建一个新的printSomething

  3. 这样,您无需使用lambda传递将要执行的回调,只需传递Label

最简单的解决方案可能是定义一个button1command=retrieve_input),它将与StringVartext)关联,并在您按下按钮时Label更新后,在该变量label上调用方法button1