Проблема в преобразовании процедурного в OO в tkinter - PullRequest
0 голосов
/ 06 октября 2019

Я написал скрипт с использованием tkinter в процедурной манере, который работал правильно:

import tkinter as tk

master = tk.Tk()

Experiment = tk.StringVar()

list1 = ['Option 1', 'Option 2', 'Option 3', 'Custom...']

def new_label(Experiment):
    if (Experiment == 'Custom...'):
        label_6 = tk.Label(master,
              text='Experiment',
              relief = 'solid',
              width=20,
              font=('arial',10,'bold')).pack()
Experiment.set('Experiment')
droplist = tk.OptionMenu(master, Experiment, *list1, command = new_label)

droplist.config(width=20)
droplist.pack()

master.mainloop()

Однако, когда я попытался использовать объектно-ориентированный подход:

import tkinter as tk


class demo1:
    def __init__(self, master):
        self.master = master
        self.Experiment = tk.StringVar()

        self.Experiment.set('Experiment')
        list1 = ['Option 1', 'Option 2', 'Option 3', 'Custom...']
        self.droplist = tk.OptionMenu(self.master, self.Experiment, *list1, command = self.new_label)

        self.droplist.config(width=20)
        self.droplist.pack()

    def new_label(self):
        if (self.Experiment == 'Custom...'):
            label_6 = tk.Label(self.master,
                  text='Experiment',
                  relief = 'solid',
                  width=20,
                  font=('arial',10,'bold')).pack()

root = tk.Tk()
app = demo1(root)
root.mainloop()

Я столкнулся с этой ошибкой:

Исключение в обратном вызове Tkinter (последний последний вызов):
Файл "/home/majido/anaconda3/lib/python3.7/tkinter/init. py ", строка 1705, в вызов , возврат файла self.func (* args)" /home/majido/anaconda3/lib/python3.7/tkinter/init.py ",строка 3442, в call self .__ callback (self .__ value, * args) TypeError: new_label () принимает 1 позиционный аргумент, но 2 были даны

, к которым я не мог относитьсято, что я уже закодировал, я ничего не пропустил.

1 Ответ

0 голосов
/ 06 октября 2019

OptionMenu обратный вызов command получает параметр, выбранный пользователем, который не используется вашим методом (он принимает только неявный self). Обратите внимание, что в вашей первой версии функция принимает Experiment, но не во второй версии. Вам нужно как минимум добавить фиктивный параметр, чтобы обратный вызов new_label принимал правильное количество аргументов:

def new_label(self, _):  # An "unnamed" parameter to handle the unneeded data given to the callback
    . . .

Или просто создайте функцию-обертку, которая выбрасывает переданный вам аргумент:

self.droplist = tk.OptionMenu(. . ., command = lambda _: self.new_label())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...