取1个位置参数(给定0)

时间:2015-04-01 11:23:25

标签: python python-3.x typeerror

我试图这样做,所以每次点击按钮我都可以运行不同的东西。

Counter = 0

def B_C(Counter):
    Counter = Counter + 1
    if counter == 1:
        print("1")
    elif counter == 2:
        print("2")
    else:
         if counter == 3:
             Print("3")

但是我得到了

TypeError: B_C() takes exactly 1 positional argument (0 given)

2 个答案:

答案 0 :(得分:3)

试试这个:

counter = 0

def B_C():
    global counter
    counter += 1
    if counter == 1:
        print("1")
    elif counter == 2:
        print("2")
    else:
         if counter == 3:
             print("3")

B_C()
B_C()
B_C()

输出:

1
2
3

第一件事:python区分大小写,因此Counter不等于counter。在函数中,您可以使用global counter,因此您无需将计数器传递给按钮单击。

答案 1 :(得分:2)

不要使用全局...如果你想修改一个对象python有可变对象。这些是通过引用传递的结构,该函数将改变结构内部的值。

下面是传递值的基本示例,其中函数范围之外的值不会更改。变量“c”下面是一个不可变对象,c的值不会从函数中改变。 Immutable vs Mutable types

c = 0
def foo(c):
    c = c + 1
    return c

m = foo(c)
print(c) # 0
print(m) # 1

这是一个可变对象的示例,并通过引用传递(我相信python总是通过引用传递,但具有可变和不可变对象)。

c = [0]
def foo(c):
    c[0] = c[0] + 1
    return c

m = foo(c)
print(c) # [1]
print(m) # [1]

或上课。除了全局之外的任何东西。

class MyCount(object):
    def __init__(self):
        self.x = 0
    # end Constructor

    def B_C(self):
        self.x += 1
        pass # do stuff
    # end B_C

    def __str__(self):
        return str(self.x)
    # end str
# end class MyCount

c = MyCount()
c.B_C()
print(c)
c.B_C()
print(c)

你还提到你正在使用一个按钮。如果您想按下按钮将参数传递给函数,则可能必须使用lambda函数。我真的不知道TKinter,但是对于PySide,你已经连接按钮来点击一个函数。可能没有简单的方法将变量传递到按钮单击功能。 http://www.tutorialspoint.com/python/tk_button.htm

def helloCallBack(txt):
    tkMessageBox.showinfo("Hello Python", txt)

# from the link above
B = Tkinter.Button(top, text="Hello", command= lambda x="Hello": helloCallBack(x))
# lambda is actually a function definition.
# The lambda is like helloCallBack without the parentheses.
# This helps you pass a variable into a function without much code