'self' Python 非 class 函数中的参数
'self' parameter in Python non-class functions
我目前正在向一位热心的小学生教授一些基础知识 Python,但我在解决蚀刻代码中的一个奇怪的小异常问题时遇到了一些麻烦-素描。
# myEtchASketch application
from tkinter import *
#####Set variables
canvas_height = 400
canvas_width=600
canvas_colour="black"
p1_x=canvas_width/2
p1_y=canvas_height
p1_colour="blue"
line_width=6
line_length=9
####New window
window=Tk()
window.title("MyEtchASketch")
canvas=Canvas(bg=canvas_colour, height=canvas_height, width=canvas_width,highlightthickness=0)
canvas.pack()
##### Functions:
#player controls
def p1_move_N(self):
global p1_y
canvas.create_line(p1_x, p1_y, p1_x, (p1_y-line_length), width=line_width, fill=p1_colour)
p1_y = p1_y - line_length
def p1_move_S(self):
global p1_y
canvas.create_line(p1_x, p1_y, p1_x, (p1_y+line_length), width=line_width, fill=p1_colour)
p1_y=p1_y+line_length
def p1_move_W(self):
global p1_x
canvas.create_line(p1_x, p1_y, (p1_x-line_length), p1_y, width=line_width, fill=p1_colour)
p1_x=p1_x-line_length
def p1_move_E(self):
global p1_x
canvas.create_line(p1_x, p1_y, (p1_x+line_length), p1_y, width=line_width, fill=p1_colour)
p1_x=p1_x+line_length
def erase_all(self):
canvas.delete(ALL)
#bind movement to key presses
window.bind("<Up>", p1_move_N)
window.bind("<Down>",p1_move_S)
window.bind("<Left>", p1_move_W)
window.bind("<Right>", p1_move_E)
window.bind("<u>", erase_all)
window.mainloop()
播放器控件是困扰我的地方。如果我没有添加 self
,代码将不起作用。我得到:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\ThisIsNotMyRealUserFolder\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1550, in __call__
return self.func(*args)
TypeError: p1_move_N() takes 0 positional arguments but 1 was given
我做了一些研究,发现 self
用于 class 方法。如您所见,none 个函数是 class 个方法。我唯一能想到的是 bind()
将传递给它的所有函数视为 class 方法,这意味着它们需要 self
才能正常运行。
感谢任何帮助。
传递给 bind
的可调用函数接受一个参数:事件。因此,定义函数的正确方法是例如:
def p1_move_W(event):
global p1_x
canvas.create_line(p1_x, p1_y, (p1_x-line_length), p1_y, width=line_width, fill=p1_colour)
p1_x=p1_x-line_length
Tk
将传递一个位置参数,因此您可以随意调用该参数(self
可以,是的,banana
也可以) .
我目前正在向一位热心的小学生教授一些基础知识 Python,但我在解决蚀刻代码中的一个奇怪的小异常问题时遇到了一些麻烦-素描。
# myEtchASketch application
from tkinter import *
#####Set variables
canvas_height = 400
canvas_width=600
canvas_colour="black"
p1_x=canvas_width/2
p1_y=canvas_height
p1_colour="blue"
line_width=6
line_length=9
####New window
window=Tk()
window.title("MyEtchASketch")
canvas=Canvas(bg=canvas_colour, height=canvas_height, width=canvas_width,highlightthickness=0)
canvas.pack()
##### Functions:
#player controls
def p1_move_N(self):
global p1_y
canvas.create_line(p1_x, p1_y, p1_x, (p1_y-line_length), width=line_width, fill=p1_colour)
p1_y = p1_y - line_length
def p1_move_S(self):
global p1_y
canvas.create_line(p1_x, p1_y, p1_x, (p1_y+line_length), width=line_width, fill=p1_colour)
p1_y=p1_y+line_length
def p1_move_W(self):
global p1_x
canvas.create_line(p1_x, p1_y, (p1_x-line_length), p1_y, width=line_width, fill=p1_colour)
p1_x=p1_x-line_length
def p1_move_E(self):
global p1_x
canvas.create_line(p1_x, p1_y, (p1_x+line_length), p1_y, width=line_width, fill=p1_colour)
p1_x=p1_x+line_length
def erase_all(self):
canvas.delete(ALL)
#bind movement to key presses
window.bind("<Up>", p1_move_N)
window.bind("<Down>",p1_move_S)
window.bind("<Left>", p1_move_W)
window.bind("<Right>", p1_move_E)
window.bind("<u>", erase_all)
window.mainloop()
播放器控件是困扰我的地方。如果我没有添加 self
,代码将不起作用。我得到:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\ThisIsNotMyRealUserFolder\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1550, in __call__
return self.func(*args)
TypeError: p1_move_N() takes 0 positional arguments but 1 was given
我做了一些研究,发现 self
用于 class 方法。如您所见,none 个函数是 class 个方法。我唯一能想到的是 bind()
将传递给它的所有函数视为 class 方法,这意味着它们需要 self
才能正常运行。
感谢任何帮助。
传递给 bind
的可调用函数接受一个参数:事件。因此,定义函数的正确方法是例如:
def p1_move_W(event):
global p1_x
canvas.create_line(p1_x, p1_y, (p1_x-line_length), p1_y, width=line_width, fill=p1_colour)
p1_x=p1_x-line_length
Tk
将传递一个位置参数,因此您可以随意调用该参数(self
可以,是的,banana
也可以) .