这是我的代码:
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
答案 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
您正面临以下问题:
您正在定义一个永远不会调用的内部函数jobs
。
即使您正在呼叫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
。
这样,您无需使用lambda传递将要执行的回调,只需传递Label
最简单的解决方案可能是定义一个button1
(command=retrieve_input
),它将与StringVar
(text
)关联,并在您按下按钮时Label
更新后,在该变量label
上调用方法button1
。