[英]Printing variables in tkinter GUI
這是我的代碼:
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
,每次按button1
都會創建一個新的Label
。
在這種情況下,您不需要使用lambda來傳遞將要執行的回調,您只需傳遞command=retrieve_input
最簡單的解決方案可能是定義一個與Label
( label
)相關聯的StringVar
( text
),當您按下按鈕button1
您更新調用該變量text
上的方法set
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.