在TKINTER里的after循环函数中运行两个函数对外部变量累加赋值,为什么不成功?
import tkinter as tk
aa = 10
bb = [100]
def cat():
global aa
aa += 5
def dog():
bb[0] += 5
def game_loop():
cat()
dog()
base.after(FPS, game_loop)
print(aa)
print(bb)
FPS = 400
base = tk.Tk()
base.after(FPS, game_loop)
base.mainloop()
你知道打印出来的aa和bb是多少吗?原地不动
很不理解,求开悟
2个print只运行了一次。
放到17行前面,或者分别放到2个函数里
最近正式开始学习Python中GUI设计的最主要库之一:tkinter。
实在是憋不住了,写个啥东西都是只能在Python中运行,所以很想自己也能编写一个小软件,能够实现用户交互那种。
那么就必须学习关于GUI方面的知识。
与之前学习Python中的其他库不一样,以往总是先写内置的函数方法和属性,再与实际相结合,来解决生活工作中的问题。
这一次学习tkinter,我通过一个个实际的项目来逆向学习tkinter中的各种方法和属性。
因为对于这种实操性强、涉及内容比较多的库,采取这样的方式进行学习印象会更加深刻,同时更容易关注知识的主线脉络。
(个人见解)
问题中提到了在Tkinter中的after循环函数中运行两个函数对外部变量累加赋值,但是无法成功。根据提示,我们需要提供具体的Tkinter代码实现来更准确地理解问题。
根据参考资料的代码段落1,我们可以看到一些与Tkinter相关的函数,如search、download_one_book、download_one_chapter和novel_load。这些函数可能涉及到对外部变量的操作。
在问题中没有给出具体的代码示例,因此无法确定问题出现在哪个具体的函数中。但是从提示3来看,Tkinter的事件处理是单线程的,可能存在线程安全问题。因此,我们可以尝试在外部变量被赋值的地方使用锁来保证线程安全。
下面是一个示例代码,用于说明如何在Tkinter的after循环函数中对外部变量进行累加赋值,并保证线程安全。
import tkinter as tk
import threading
def increment(var):
# 模拟累加操作
var += 1
return var
def update_label(var, label):
# 更新标签显示
label["text"] = str(var)
def after_func(var, label):
global lock
with lock:
# 在锁的保护下对外部变量进行累加赋值
var = increment(var)
# 更新标签显示
update_label(var, label)
# 递归调用after函数
label.after(1000, after_func, var, label)
def start():
# 创建主窗口
root = tk.Tk()
# 创建标签
label = tk.Label(root, text="0", font=("Arial", 24))
label.pack()
# 创建锁
global lock
lock = threading.Lock()
# 调用after函数
label.after(1000, after_func, 0, label)
# 启动事件循环
root.mainloop()
start()
在上面的示例代码中,我们创建了一个窗口,其中包含一个标签用于显示外部变量的值。我们通过递归调用after函数,每隔1秒对外部变量进行累加赋值,并更新标签显示。同时,我们使用了一个锁来保证对外部变量的累加赋值操作的线程安全。
请注意,上述代码仅作为示例,具体的解决方案可能因情况而异。如果问题仍然存在,建议提供更详细的代码示例和错误提示,以便我们更好地理解问题并提供准确的解决方案。