簡體   English   中英

在tkinter GUI中打印變量

[英]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()

你正面臨着這些問題:

  1. 您正在定義一個永遠不會被調用的內部函數printSomething

  2. 即使您正在調用printSomething ,每次按button1都會創建一個新的Label

  3. 在這種情況下,您不需要使用lambda來傳遞將要執行的回調,您只需傳遞command=retrieve_input

最簡單的解決方案可能是定義一個與Labellabel )相關聯的StringVartext ),當您按下按鈕button1您更新調用該變量text上的方法set

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM