Это мой код:
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, как это сделать, и смог построить код до этого момента. Однако, когда я нажимаю кнопку "Показать значения", ничего не происходит. Я не мог найти нигде в Интернете, который помог бы решить эту проблему. Есть что-то принципиально неправильное с моим кодом? Использование Python 3.7
Вы определяете вложенную функцию 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)
# ...
У вас могут быть другие ошибки в коде, но я думаю, что если вы исправите эти три, вы, по крайней мере, будете очень близки ко всему, что работает.
Учитывая, что вы используете Python 3.7, как вы сказали, следующий код решит вашу проблему:
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
вы собираетесь создавать новый Label
каждый раз, когда вы нажимаете button1
.
В этом случае вам не нужно использовать lambda для передачи обратного вызова, который будет выполнен, вы можете просто передать command=retrieve_input
Самое простое решение могло бы быть, чтобы определить StringVar
(text
), который будет связан с Label
(label
), и при нажатии на кнопку button1
обновить вызов метода set
на этой переменной text
.
50.csv
?