tkinter - изменение переменных, назначенных меткам, приводит к дублированию окна - PullRequest
0 голосов
/ 05 июля 2018

Я использую Python для взаимодействия с некоторыми таблицами Excel. У меня все это работает, и теперь я работаю над пользовательским интерфейсом, используя tkinter. У меня есть 3 кнопки одна, чтобы вытащить местоположение файла данных, место сохранения выходного файла, и у меня есть кнопка запуска.

Я пытаюсь использовать tkinter.Label для отображения значения первых двух кнопок, например "c:/user/data_file". Однако, когда я получаю переменную от пользователя и пытаюсь обновить GUI с ее помощью, создается копия окна с обновленной информацией. Мне нужно, чтобы он обновлялся прямо в текущее окно без проблем. Я работал, чтобы попытаться решить эту проблему, но я просто не могу понять это. Ниже приведен код для моего tkinter материала.

def main(): 

    def InputFilePrompt():
        global InputFileLocation
        InputFileLocation = askopenfilename()
        update()  

    def OutputFilePrompt():
        global OutputFileLocation
        OutputFileLocation = filedialog.asksaveasfilename()
        update()

    def update():

        root = Tk()

        root.title("test")
        root.resizable(width=TRUE,height=TRUE)

        InputFile = Button(root, text = "input data", command = InputFilePrompt)
        InputFile.grid(row = 0,column = 0)

        InputFileValue = Label(root, text = InputFileLocation, bg = 'white')
        InputFileValue.grid(row = 1,column = 0)

        OutputFile = Button(root, text = "Compiled Data save loacation", command = OutputFilePrompt)
        OutputFile.grid(row = 4,column = 0)

        OutputFileValue = Label(root, text = "location: N/A", bg = 'white')
        OutputFileValue.grid(row = 5,column = 0)

        startButton = Button(root, text = "start", bg = 'light green', command = Excel)
        startButton.grid(row = 7)

        BlankUI = [0 for x in range(2)]
        for blankspace in range(2):
            BlankUI[blankspace] = Label(root, text = "")
        BlankUI[0].grid(row = 2)
        BlankUI[1].grid(row = 6)

        root.mainloop()   

    update()

Ошибка:

Picture of the Error

1 Ответ

0 голосов
/ 05 июля 2018

Вот версия, которая не создает двойное окно. Я включил большинство предложений, которые я сделал в комментариях, за исключением одного относительно определения функций внутри других функций. Следующее все еще делает это, потому что это позволило очень легко избежать использования global переменных (которые обычно считаются плохой практикой программирования).

Обратите внимание, что функции update() нет. Значения двух tkinter.Label s теперь хранятся в двух tkinter.StringVar s объектах, а не в обычных строках Python. A StringVar является одним из tkinter так называемых «переменных» классов. Их главная особенность заключается в том, что они заставляют все виджеты, ссылающиеся на них, автоматически обновляться при каждом изменении их содержимого. Чтобы использовать их в Label, они указываются с помощью опции textvariable= ( вместо опции text=) при вызове конструктора. Вот некоторая документация Я нашел о них более подробную информацию о том, как они работают.

import tkinter as tk
from tkinter.filedialog import askopenfilename, asksaveasfilename

def excel():
    """ Undefined. """
    pass


def main():
    def get_input_file_location():
        input_file_location.set(askopenfilename())

    def get_output_file_location():
        output_file_location.set(asksaveasfilename(confirmoverwrite=False))

    root = tk.Tk()
    root.title('test')
    root.resizable(width=True, height=True)

    input_file_location = tk.StringVar()
    input_file_location.set('<undefined>')
    output_file_location = tk.StringVar()
    output_file_location.set('<undefined>')

    input_file = tk.Button(root, text="Input data",
                           command=get_input_file_location)
    input_file.grid(row=0, column=0)
    input_file_value = tk.Label(root, textvariable=input_file_location,
                                bg='white')
    input_file_value.grid(row=1, column=0)

    output_file = tk.Button(root, text='Compiled data save loacation',
                            command=get_output_file_location)
    output_file.grid(row=4, column=0)
    output_file_value = tk.Label(root, textvariable=output_file_location,
                                 bg='white')
    output_file_value.grid(row=5, column=0)

    startButton = tk.Button(root, text='start', bg='light green',
                            command=excel)
    startButton.grid(row=7)

    blank_ui = [tk.Label(root, text='') for _ in range(2)]
    blank_ui[0].grid(row=2)
    blank_ui[1].grid(row=6)

    root.mainloop()


if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...