Python 3.7 + tkInter: Как я могу убедиться, что кнопке назначена отдельная функция из файла? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть некоторые проблемы, связанные с тем, с чем я недавно столкнулся в python.

Итак, я хочу разрешить пользователю загружать несколько файлов json, все они перечислены в списке python.Эти файлы содержат параметры, используемые для создания кнопок, а именно: цвет, который должна иметь кнопка, текст, который должен отображаться в ней, и команду, которую необходимо выполнить после нажатия.

        def createTags(self):
        for items in self.LoadedInstallProfiles:
            with open(items, "r") as jsonfiles:
                self.loadeddata = json.load(jsonfiles)
                self.tag = Button(self.tagmenu, text=self.loadeddata.get("profilename"), background=
                self.loadeddata.get("profilecolor"), command=print(self.loadeddata.get("profilename")))
                self.tag.pack(side="top",fill="x")

Проблема заключается в том, что: кнопки отображаются с их индивидуальным цветом и текстом, но все они, кажется, при печати нажимают одно и то же имя профиля, которое указано в последнем файле json в списке.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Я полагаю, что проблема с command=print(self.loadeddata.get("profilename")) аналогична проблеме с лямбда-выражениями (при этом я удивлен, что ваши кнопки работают вообще. Они должны печатать один раз на init, а затем никогда не работать, потому что вы вызываете print насоздание кнопки вместо сохранения ссылки на печать).

Из-за особенностей работы лямбды здесь в цикле, подобном этому, в итоге вы печатаете только последнее значение в цикле для всех команд.Вместо этого вам нужно использовать лямбда-оператор, а также определить значение в лямбда-выражении для каждого цикла, чтобы точно записать правильные данные для оператора печати. ​​\

Для этого я создал 3 тестовых файла:

test.json:

{"profilename":"test", "profilecolor": "green"}

test2.json:

{"profilename":"test2", "profilecolor": "blue"}

test3.json:

{"profilename":"test3", "profilecolor": "orange"}

Пример кода:

import tkinter as tk
import json

class Window(tk.Tk):
    def __init__(self):
        super().__init__()
        self.btn_list = []
        for file in ['test.json', 'test2.json', 'test3.json']:
            with open(file, 'r') as f:
                self.btn_list.append(json.load(f))

        self.create_tags()

    def create_tags(self):
        for item in self.btn_list:
            tk.Button(self, text=item.get("profilename"), background=item.get("profilecolor"),
                      command=lambda x=item.get("profilename"): print(x)).pack(side="top", fill="x")


if __name__ == '__main__':
    Window().mainloop()

Результаты:

enter image description here

0 голосов
/ 27 февраля 2019

Я обычно храню созданные виджеты кнопок в списке.Я изменил ваш метод.Увидеть ниже.

def createTags(self):

    # First create the widget and append to list variable 
    self.tags = [] #List to store button widgets
    for items in self.LoadedInstallProfiles:
        with open(items, "r") as jsonfiles:
            loadeddata = json.load(jsonfiles)
            text = loadeddata.get("profilename")
            bg = loadeddata.get("profilecolor")
            tag = Button( self.tagmenu, text=text, background=bg, command=print(text) )
            self.tag.append( tag )

    # Then display the widgets
    for tag in self.tags:
        tag.pack(side="top",fill="x")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...