【问题标题】:TypeError: Function takes 1 positional argument but 2 were given kivy pythonTypeError:函数接受 1 个位置参数,但给定了 2 个 kivy python
【发布时间】:2020-12-16 20:19:09
【问题描述】:

我尝试在 self 之后添加实例,但仍然无法正常工作

这是错误信息

File "kivy\_event.pyx", line 703, in kivy._event.EventDispatcher.dispatch

File "kivy\_event.pyx", line 1214, in kivy._event.EventObservers.dispatch

File "kivy\_event.pyx", line 1138, in kivy._event.EventObservers._dispatch

TypeError: sss() takes 1 positional argument but 2 were given

这里是完整的 kivy python 代码

import kivy

from kivy.uix.widget import Widget

from kivy.properties import ObjectProperty

from kivy.app import App

from kivy.uix.label import Label

from kivy.uix.gridlayout import GridLayout

from kivy.uix.textinput import TextInput

from kivy.uix.button import Button

from kivy.uix.screenmanager import ScreenManager, Screen



class Touch(Widget):

    def __init__(self, **kwargs):

        super(Touch, self).__init__(**kwargs)

        self.cols = 1

        self.Rc1 = Button(text="Submit", font_size=40)

        self.Rc1.bind(on_press=self.sss)

        self.add_widget(self.Rc1)


    def sss(self):

        self.Rc1 = Button(text="Push Me !",

                          font_size="20sp",

                          background_color=[1, 0, 0, 1],

                          color=(1, 1, 1, 1),

                          size=(32, 32),

                          size_hint=(.2, .2),

                          pos=(300, 250))

class MyApp(App):

    def build(self):

        return Touch()


if __name__ == "__main__":

    MyApp().run()

【问题讨论】:

  • 你让我们猜测错误在哪里。请更新问题以包含完整的错误消息回溯。
  • 文件“kivy_event.pyx”,第 703 行,在 kivy._event.EventDispatcher.dispatch 文件“kivy_event.pyx”,第 1214 行,在 kivy._event.EventObservers.dispatch 文件“kivy_event.pyx”中,第 1138 行,在 kivy._event.EventObservers._dispatch TypeError: sss() 接受 1 个位置参数,但给出了 2 个
  • 只需将,*args 添加到sss() 的args 列表中即可。
  • 谢谢,John Anderson,错误信息消失了,但我在 sss 中的函数仍然没有执行,或者以另一种方式,我的按钮没有改变它的颜色。
  • 你有 self.Rc1 访问现有按钮并更改其值 - 可能是 self.Rc1.color = ...

标签: python function kivy typeerror


【解决方案1】:

当您单击按钮时,它会使用一些信息执行您的功能。在不同的 GUI 中,它可以使用不同的信息。在某些 GUI 中,它可以是有关事件的信息,在其他 GUI 中,它可以是有关小部件的信息,等等。

Kivy 发送有关点击的小部件的信息,您必须接收它

def sss(self, widget):

如果您想更改现有的Button,请不要创建新按钮 - 如果您将其分配给同一个变量,它不会更改现有的。您必须使用 add_widget() 删除旧按钮并添加新按钮

self.Rc1 中有现有的按钮,所以你可以这样做

def sss(self, widget):
    self.Rc1.text = "Push Me !"
    self.Rc1.font_size = "20sp"
    self.Rc1.background_color = [1, 0, 0, 1]
    self.Rc1.color = (1, 1, 1, 1)
    self.Rc1.size = (32, 32)
    self.Rc1.size_hint = (.2, .2)
    self.Rc1.pos = (300, 250)

但更有趣的是,您还可以在 sss(self, widget): 中获得此小部件,您可以这样做

def change_button(self, widget):
    widget.text = "Push Me !"
    widget.font_size = "20sp"
    widget.background_color = [1, 0, 0, 1]
    widget.color = (1, 1, 1, 1)
    widget.size = (32, 32)
    widget.size_hint = (.2, .2)
    widget.pos = (300, 250)

这样你可以用不同的按钮使用相同的功能

import kivy
from kivy.uix.widget import Widget
from kivy.app import App
from kivy.uix.button import Button


class Touch(Widget):

    def __init__(self, **kwargs):
        super(Touch, self).__init__(**kwargs)
        
        #self.all_buttons = []
        
        for row in range(10):
            for col in range(10):
                x = col * 100
                y = row * 100
                button = Button(text=f"{row},{col}", pos = (x, y))
                button.bind(on_press=self.change_button)
                
                self.add_widget(button)
                
                #self.all_buttons.append(button)

    def change_button(self, widget):
        if widget.background_color == [1,1,1,1]:
            widget.background_color = [1, 0, 0, 1]
        else:
            widget.background_color = [1, 1, 1, 1]


class MyApp(App):

    def build(self):
        return Touch()

if __name__ == "__main__":
    MyApp().run()

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2021-10-11
    • 1970-01-01
    • 2017-01-12
    相关资源
    最近更新 更多