Python __init () __ error, хотя я не использую init () - PullRequest
0 голосов
/ 05 апреля 2020

Я новичок в Python. Я пытаюсь использовать его для создания GUI, чтобы управлять моим arduino.

Поскольку я не полностью понимаю python, тем более Tkinter или pySerial, я нашел фрагмент кода в Интернете.

Фрагмент должен создать GUI, а также будет возможность выбрать COM-порт для связи с Arduino.

Это код:

import serial.tools.list_ports
from tkinter import *

def on_select(selection):
    # open the port and command it to start the LED blinking here
    print(selection)

root = Tk()
ports = serial.tools.list_ports.comports()
default = StringVar(root, "Please Select Port")
OptionMenu(root, default, *ports, command=on_select).pack()
root.mainloop()

Я запускаю это (у меня есть Python 3.8.2), и я получаю эту ошибку:

Traceback (most recent call last):
  File "code.py", line 11, in <module>
    OptionMenu(root, default, *ports, command=on_select).pack()
TypeError: __init__() missing 1 required positional argument: 'value'

Однако у меня нет init () чтобы передать аргумент.

1 Ответ

1 голос
/ 05 апреля 2020

Вы вызываете его неявно, с неправильными / недостаточными позиционными параметрами здесь:

OptionMenu(root, default, *ports, command=on_select)

Когда вы вызываете класс с параметрами, вызывается __init__.

help(OptionMenu) показывает подпись инициализатора:

class OptionMenu(Menubutton)
 |  OptionMenu(master, variable, value, *values, **kwargs)

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

пример использования:

w = OptionMenu(master, variable, "one", "two", "three")

Здесь ваш список ports пуст, поэтому распаковка не приводит к каким-либо аргументам. Что объясняет ошибку. Одно «исправление» будет следующим:

OptionMenu(root, default, *(ports or ["<empty>"]), command=on_select)

Если список пуст, у вас есть только одна опция (пустая). Или проверьте, не пусто ли, и создайте сообщение уровня пользователя, если список пуст

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