python - TypeError: 'Tk' object is not callable 为什么我会收到此错误消息
问题描述
from tkinter import *
import tkinter as tk
window = tk.Tk()
# Size of Canvas
window_height = 400
window_width = 600
window_colour = "red"
thickness = 0
# Creating the Canvas
window = window(bg=window_colour, height = window_height, \
width = window_width, highlightthickness = thickness)
# Variables of the Pen
p1_x = window_width/2
p1_y = window_height
p1_colour = "green"
line_width = 5
line_length = 5
# Player Controls, Up, Down, Left, Right and Clear the screen
def p1_move_N(event):
global p1_y
window.create_line(p1_x, p1_y, p1_x, (p1_y-line_length),
width=line_width,fill=p1_colour)
p1_y = p1_y - line_length
p1_move_N()
def p1_move_S(event):
global p1_y
window.create_line(p1_x, p1_y, p1_x, (p1_y+line_length),width=line_width,fill=p1_colour)
p1_y = p1_y + line_length
p1_move_S()
def p1_move_W(event):
global p1_x
window.create_line(p1_x, p1_y, (p1_x-line_length),p1_y, width=line_width,fill=p1_colour)
p1_x = p1_x - line_length
p1_move_W()
def p1_move_E(event):
global p1_x
window.create_line(p1_x,p1_y, (p1_x+line_length), p1_y, width=line_width,fill=p1_colour)
p1_x = p1_x + line_length
p1_move_E()
def erase_all(event):
canvas.delete(ALL)
erase_all()
# Keyboard Controls
window.bind("<Up>", p1_move_N)
window.bind("<Down>", p1_move_S)
window.bind("<Right>", p1_move_E)
window.bind("<Left>", p1_move_W)
请有人帮我解决这个问题,这是为了我的学校工作,而且我在 Macbook Pro 上,我是 python 新手,非常感谢一些帮助。当我运行它时,它说 TypeError: 'Tk' object is not callable 但是当我访问其他网站和这个网站时,我得到了不同的方法,它们似乎都不起作用,所以我认为发布我的代码会有很大帮助。
解决方案
window
您对根窗口 ( window = tk.Tk()
) 和画布( window = window(...)
,但应该是)使用了相同的变量canvas = tk.Canvas(...)
。
以下是修复名称冲突的修改代码:
import tkinter as tk
window = tk.Tk()
# Size of Canvas
window_height = 400
window_width = 600
window_colour = "red"
thickness = 0
# Creating the Canvas
canvas = tk.Canvas(bg=window_colour, height = window_height,
width = window_width, highlightthickness = thickness)
canvas.pack(fill="both", expand=1)
# Variables of the Pen
p1_x = window_width/2
p1_y = window_height
p1_colour = "green"
line_width = 5
line_length = 5
# Player Controls, Up, Down, Left, Right and Clear the screen
def p1_move_N(event=None):
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
#p1_move_N()
def p1_move_S(event=None):
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
#p1_move_S()
def p1_move_W(event=None):
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
#p1_move_W()
def p1_move_E(event=None):
global p1_x
print('move E')
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
#p1_move_E()
def erase_all(event=None):
canvas.delete(ALL)
#erase_all()
# Keyboard Controls
canvas.bind("<Up>", p1_move_N)
canvas.bind("<Down>", p1_move_S)
canvas.bind("<Right>", p1_move_E)
canvas.bind("<Left>", p1_move_W)
# need to make canvas focused, otherwise keyboard events will not be received
canvas.focus_set()
window.mainloop()
注意:像下面这样导入tkinter
模块是不好的做法:
from tkinter import *
import tkinter as tk
建议使用import tkinter as tk
。