在 Tkinter Python 中创建全局画布
Posted
技术标签:
【中文标题】在 Tkinter Python 中创建全局画布【英文标题】:Creating a global canvas in Tkinter Python 【发布时间】:2014-11-25 15:03:26 【问题描述】:我正在做一个简单的游戏作为学校作业,但我在更新我的画布时遇到了问题。我尝试了一些循环和睡眠命令,但它们似乎不起作用。现在我有了应该刷新画布的代码,但我不知道如何将画布传递给我的 updateCanvas 函数。
基本上我有两个功能:
def canvas(self):
canvas = Canvas(self)
button = Button(self, text="test", command=self.updateCanvas)
button.place(x=240, y=5)
然后我有一个更新画布的方法
def updateCanvas(self):
canvas.create_oval(ovalx, ovaly, ovalx2, ovaly2, fill="black")
按下按钮应该更新画布,但它说画布不是全局的。这就说得通了。我以前做过java编程。出于某种原因将画布更改为:
def canvas(self):
global canvas = Canvas(self)
这给了我一个“语法错误:无效语法”
我该怎么办?使用循环?我不能在类内创建一个全局变量吗?将游戏想象成棋子或国际象棋,当棋子或棋子移动时,我需要更新屏幕。
【问题讨论】:
【参考方案1】:第一:
global canvas = Canvas(self)
这给你一个 SyntaxError
的原因是它不是有效的 Python。
global
语句只接受一个或多个名称。如果你想给名字赋值,你需要一个单独的赋值语句:
global canvas
canvas = Canvas(self)
(如果您想知道为什么 Python 是这样设计的,这并不难解释……但如果您只想知道如何使用 Python,而不是如何设计自己的语言,那么这里不相关。 )
但是,您可能不想在这里首先使用全局变量。类的全部意义在于它们的实例可以具有属性,这些属性将某事物的相关状态联系在一起。你几乎肯定想要这个:
self.canvas = Canvas(self)
然后在其他地方,在您的其他方法中,您会执行以下操作:
self.canvas.create_oval(ovalx, ovaly, ovalx2, ovaly2, fill="black")
您可能会感到困惑,因为在 Java 中,您在类上声明实例成员,然后 canvas
神奇地意味着与 this.canvas
相同的东西。 Python 不是这样工作的。变量不在任何地方声明,它们只是动态创建的,并且实例变量(和方法)总是需要显式的self.
。
【讨论】:
这个答案让我想知道语言之间是否存在语法差异概要,类似于 MSDN,但具有更广泛的语言。因为有很多类似的概念。或者甚至只是一个地方的语言摘要来比较所有的优点和缺点。 @PJRosenburg:有很多网站比较和对比两种语言,但通常它们要么是由两种语言之一的支持者编写的(“为什么 JS 比 Ruby 糟糕”) ,或作为从一种语言迁移到另一种语言的指南(“Java 程序员的 Python”)编写。但实际上,语法问题通常是一件小事。在不知道全局变量在 Python 中仍然受模块限制的情况下,并且习惯上大多数 Java 类变量实际上应该是 Python 全局变量,等等,即使它编译,你也会写出糟糕的代码…… @PJRosenburg:此外,Wikipedia 通常在句法和语义差异方面都非常出色,因为它们具有广泛的共同特征。例如,请参阅for
。以上是关于在 Tkinter Python 中创建全局画布的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Tkinter 在 Python 2.7 中创建等宽列
如何在 python 中创建路径并将其显示在 qml 画布上
Tkinter和Twisted - 在Python中创建一个deamonic reactor#