我有个问题。以前他们帮我解决了一些功能的问题;这非常有帮助,我解决了这个问题,但我当然遇到了另一个问题,哈哈。
要在应用程序结束时给出一个值(应用程序函数的问题),我需要从函数内部给它一个值n
,但它告诉我必须定义它。但是如果我在打印值时定义它,它会给我我定义的值,就好像它没有帮助一样。
我试图使变量成为全局变量,但它一直说变量未定义。
这是显示问题的代码部分:
import tkinter as tk
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
# Lo que se hace aqui no es relevante
# para el problema
def p1():
global n
n = 1
def p2():
global n
n = n + 2
# Y así en varias funciones más
一般来说,使用全局变量不是一个好主意。在这个答案的最后,我会给你一个替代方案。
但是如果你想使用全局变量,你的代码的问题是没有这样的变量!
在你放置的函数中
global n
,你基本上是在告诉 python,如果该函数试图改变一个n
名为'不是你会放global n
)。相反,您应该使用名为n
. 但是您的代码中不存在该变量。只需添加它。例如,在
class SampleApp
你放这已经创建了全局变量,初始值为
0
. 当声明函数global n
修改 的值时n
,它们将修改该全局变量。请注意,仅存在变量是不够的。此外,函数必须将其声明为全局,否则,例如,当它声明时,将在该函数中创建一个
p1()
不会n=1
影响全局变量的局部变量(此外,一旦函数结束,局部变量就会被销毁)。选择
您可以使用对象属性代替全局变量。对象的属性类似于变量,但它只属于该对象。例如,它们通过打字
self.n
来使用。但是,在您的特定情况下,使用这种方法会迫使您更改代码中的很多内容。每个函数
p1()
,p2()
等 应该声明一个self
能够起作用的参数self.n
,但这会改变您将这些方法绑定到您的 GUI 按钮的方式,因为您拥有它command=SampleApp.p1
,例如,您将它们视为类方法而不是目的。相反,您应该将 etccommand=controller.p1
与所有其他人放在一起(因为它controller
是 class 的实例对象SampleApp
)。我再说一遍,尽管这更正确,但在您的情况下可能会更令人困惑,因为从您的代码来看,可以看出您没有正确理解面向对象编程的概念。
更新
在额外的用户反馈之后,问题似乎不仅在于该全局变量的使用,还在于在程序结束时显示该变量时,它似乎没有更改其值。
事实是变量显示在标签中,标签是启动程序时创建的框架的一部分。标记获取它当时的值的副本
n
,并且由于我们在开始,它的值是 0。即使稍后更改 的值n
,标记仍然具有其原始值 0,直到它显示在结束一切。事实是,您的代码结构是一个迷宫……但无需重做所有事情,就像您拥有它一样,最简单的事情就是在显示之前更改该标签显示的内容。尽管框架是在开始时创建的,但直到最后才会显示,并且由于您有显示框架的特定方法,如果要显示的框架是最后一个,那么它可能就在您查看的位置,在这种情况下,您将文本更改为它当时
n
具有的值的标签。这将是新方法
show_frame()
:如您所见,我们检查它
page_name
是否是"LastPage"
,然后在显示该框架之前,我们使用frame.children
访问它的“子项”(组成它的标签和按钮)并选择被调用的子项"resultado"
(这将是显示值的标签ofn
),然后我们将其文本更改为当时的值n
。在类
LastPage
中,当您创建该标签时,您必须为其命名"resultado"
,以便上述代码正常工作。所以: