как отправить информацию в определение с помощью кнопки tkinter - PullRequest
0 голосов
/ 17 января 2019

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

Я пытался использовать функции по-другому, но это самое близкое, что я могу получить к тому, что я хочу.

class Menu(Frame):
    def __init__(self, master=None):
        #working out how big to make the window
        global files_in_area
        files_in_area = []
        files_in_area = os.listdir(menu_folder_loc)
        print files_in_area
        a = len(files_in_area)
        b = 3
        rows = a / b
        rows = rows + 1
        window_height = rows * 56
        root.geometry('%dx%d+%d+%d' % (450, window_height, 0, 0))
        Frame.__init__(self, master)               
        self.master = master
        self.init_menu()
    def init_menu(self):
        self.master.title("Menu")
        self.pack(fill=BOTH, expand=1)
        for i in range(0, len(files_in_area)):
            #button placment
            a = i
            b = 3
            row_no = a / b
            row_no = row_no + 1
            column_no = a % b
            global file_name
            file_name = str(files_in_area[i])
            b1 = Button(self, text=file_name, bg= "red", height=3, width=20, command=self.client_print_file).grid(row=row_no, column=column_no, sticky=W)
    def client_print_file(self):
        print file_name

У меня есть код для работы, когда я нахожу файлы и помещаю их в окно tkinter, и когда я нажимаю на кнопку, он должен открыть файл (сейчас я просто печатаю имя файла, чтобы сделать уверен, что это работает). Однако он просто печатает последний файл в списке.

Извините, если этот вопрос немного сбивает с толку, и заранее спасибо.

1 Ответ

0 голосов
/ 17 января 2019

Это не проблема для tkinter, а для областей действия и опа в Python. Я предполагаю, что вы начали работать с python, читая онлайн-материалы, или быстро познакомились. Мой первый совет: не используйте / копируйте чужой код, если вы его не понимаете. Если вы копируете, попробуйте покопаться в себе и СДЕЛАТЬ свой собственный код. Одним из хороших способов чтения материала является очень хорошая онлайн-документация по python. Некоторые упражнения, которые помогут вам начать: 1) Исследование области видимости переменных в python. 2) Что более важно: читайте о классах, то есть объектно-ориентированном программировании.

К коду: 1) Откажитесь от использования global в целом. Нет необходимости здесь. Если вы хотите использовать переменную files_in_area во всех методах класса, просто сделайте ее атрибутом класса, точно так же, как вы сделали с master, который затем вы будете использовать в другом методе, где она не была определена! Теперь к переменной filename: опять же, ditch global. Тогда имя файла находится в пределах цикла for, что именно то, что вы хотите здесь.

Посмотрите на это так: если вы вообще не использовали переменную filename, а просто поместили text=str(files_in_area[i]) в конструктор Button в качестве аргумента, вы бы не столкнулись с этой проблемой здесь - по сути, это действительно проблема думать самостоятельно и не копировать слишком много кода от кого-то другого - я знаю это, потому что это было большой проблемой для меня долгое время.

Самое сложное здесь - как передать команду в зависимости от i цикла for для каждой кнопки. Вы можете найти много здесь на stackoverflow. Это опять о переменных и их области, но также об их привязке. На каждом проходе цикла мы хотим генерировать значение команды в зависимости от i. Один из способов использовать это - использовать (на первый взгляд мистический) lambda: command=lambda i=i: self.client_print_file(i). И определить def client_print_file(self, i): ... с дополнительным аргументом i. Критическая вещь здесь является обязательной. То, что не будет работать, это command=lambda i: self.client_print_file(i). (Другой способ вместо использования лямбды - использовать частичное из functools ...) Назначение: читайте о лямбде, о чем идет речь, о привязке имен и переменных в python:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...