Tkinter中的循环函数对外部变量不能赋值

在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个函数里

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7717819
  • 这篇博客也不错, 你可以看下可视化界面Tkinter编写你的小程序
  • 除此之外, 这篇博客: 【tkinter探索之旅】小试牛刀:编写一个登录界面中的 一、前言废话 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 最近正式开始学习Python中GUI设计的最主要库之一:tkinter。

    实在是憋不住了,写个啥东西都是只能在Python中运行,所以很想自己也能编写一个小软件,能够实现用户交互那种。

    那么就必须学习关于GUI方面的知识。

    与之前学习Python中的其他库不一样,以往总是先写内置的函数方法和属性,再与实际相结合,来解决生活工作中的问题。

    这一次学习tkinter,我通过一个个实际的项目来逆向学习tkinter中的各种方法和属性。

    因为对于这种实操性强、涉及内容比较多的库,采取这样的方式进行学习印象会更加深刻,同时更容易关注知识的主线脉络。

    (个人见解)
    在这里插入图片描述
    在这里插入图片描述

  • 您还可以看一下 张日智老师的python安全开发/高级渗透技术课程中的 3.6 TKinter之滚动条、列表框、消息框小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题中提到了在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秒对外部变量进行累加赋值,并更新标签显示。同时,我们使用了一个锁来保证对外部变量的累加赋值操作的线程安全。

    请注意,上述代码仅作为示例,具体的解决方案可能因情况而异。如果问题仍然存在,建议提供更详细的代码示例和错误提示,以便我们更好地理解问题并提供准确的解决方案。