Почему мы получаем 'TypeError' при запуске следующего кода (python, Kivy)? - PullRequest
0 голосов
/ 11 июня 2018

Я новичок в python и пробую Kivy для создания GUI.Чтобы добавить фон к макету, я пытаюсь следовать примеру, приведенному в официальной документации.

(см. Пожалуйста, если вам нужно посмотреть официальную документацию)

https://kivy.org/docs/guide/widgets.html#adding-a-background-to-a-layout

В моем коде ниже, update_bg (), функция используется для обновления размера и / или положения фона (прямоугольник, нарисованный на холсте) всякий раз, когда его родитель ('layout', Kivy)Jargon) меняет свою позицию и / или размер.

class ConversationBox(BoxLayout):
  def __init__(self, **kwargs):
      super(ConversationBox, self).__init__(**kwargs)

      beside_message = BoxLayout(orientation='vertical')
      whatever_said = Label(text='Someone said Something', size_hint=(None, None), size=(100, 60))
      remove_button = Button(text='X', size_hint=(None, None), size=(30, 30))
      log = Label(text='Log', size_hint=(None, None), size=(30, 30))

      with self.canvas:
          Color(0, 1, 0, 1)
          self.background = Rectangle(pos_hint=(None, None), size_hint=(None, None), pos=self.pos, size=self.size)
          self.bind(pos=self.update_bg, size=self.update_bg)

      self.add_widget(whatever_said)
      beside_message.add_widget(remove_button)
      beside_message.add_widget(log)
      self.add_widget(beside_message)

  def update_bg(self):  # <----------------This is where the problem is
      self.background.pos = self.pos
      self.background.size = self.size


class test(App):

  def build(self):
      return ConversationBox(orientation='horizontal')


test().run()

Когда вы запускаете этот код, вы получаете и ошибку в консоли, то есть.

TypeError: update_bg ()принимает 1 позиционный аргумент, но было дано 3

Когда вы предоставите два дополнительных аргумента, скажем,

def update_bg(self, arbitrary_arg_1, arbitrary_arg_2):

Вы не получите никаких ошибок.Почему это происходит?У меня нулевая интуиция.

1 Ответ

0 голосов
/ 11 июня 2018

Ответ в документах :

bind ()

[...]

Как правило, обратные вызовы свойств вызываются с 2 аргументами (объект и новое значение свойства) и обратные вызовы событий с одним аргументом (объект).Приведенный выше пример иллюстрирует это.

[...]

Когда он читает, он отправляет нам объект, который имеет изменение, в данном случае объект ConversationBox (self) и новое значение свойства.

В общем случае следует использовать следующее:

def update_bg(self, instance, value):
    self.background.pos = self.pos
    self.background.size = self.size
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...