Печать переменных в графическом интерфейсе tkinter

1

Это мой код:

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

  • 0
    какую версию Python вы используете?
  • 0
    Не могли бы вы также предоставить содержимое вашего файла 50.csv ?
Показать ещё 5 комментариев
Теги:
pandas
csv
variables
tkinter

2 ответа

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)

# ...

У вас могут быть другие ошибки в коде, но я думаю, что если вы исправите эти три, вы, по крайней мере, будете очень близки ко всему, что работает.

  • 0
    Это имеет смысл точно! Я запустил этот код, и все еще ничего не создается на моем графическом интерфейсе.
  • 0
    @HarisKhaliq Какой код вы запускали? У меня есть 5 фрагментов кода в этом ответе; вам нужно интегрировать исправление для всех трех проблем в ваш код. И если у вас что-то не так, или у вас есть еще одна ошибка, кроме этой, я не могу отладить ее для вас без полного примера.
Показать ещё 2 комментария
1

Учитывая, что вы используете 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 вы собираетесь создавать новый Label каждый раз, когда вы нажимаете button1.

  3. В этом случае вам не нужно использовать lambda для передачи обратного вызова, который будет выполнен, вы можете просто передать command=retrieve_input

Самое простое решение могло бы быть, чтобы определить StringVar (text), который будет связан с Label (label), и при нажатии на кнопку button1 обновить вызов метода set на этой переменной text.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню