Python在class中如何绑定bind事件

问题遇到的现象和发生背景

Python tkinter bind如何在class 中绑定函数

遇到的现象和发生背景,请写出第一个错误信息

NameError: name 'WindowResize' is not defined

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
import tkinter as tk

class GUI:
    def __init__(self):
        self.window = tk.Tk()
        self.window.title("Frame test")        
        width = 400
        height = 400
        self.g_screenwidth = self.window.winfo_screenwidth()
        self.g_screenheight = self.window.winfo_screenheight()
        self.alignstr = '%dx%d+%d+%d' % (width, height, (self.g_screenwidth-width)/2, (self.g_screenheight-height)/2)
        self.window.geometry(self.alignstr) 
        self.window.config(bg='gray')
        self.window.minsize(width, height)        
        self.frame1 = tk.Frame(self.window, width=360, height=340)
        self.frame1.pack_propagate(0)
        self.frame1.place(x=20, y=10)

    def WindowResize(self):
        global save_width
        global save_height        
        self.new_width = self.window.winfo_width()
        self.new_height = self.window.winfo_height()        
        if new_width == 1 and new_height == 1:
            return
        if save_width != new_width or save_height != new_height:
            self.frame1.config(width=new_width-40, height=new_height-60)
            self.button1.place(x=20, y=new_height-40)
        self.save_width = new_width
        self.save_height = new_height

if __name__ == '__main__':
    gui = GUI()
    # gui.window.bind('', WindowResize)这行代码是错误的
    gui.window.bind('', WindowResize)
    gui.window.mainloop()

运行结果及详细报错内容

NameError: name 'WindowResize' is not defined

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

如何绑定WindowResize函数

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

看起来你在 gui.window.bind('', WindowResize) 这行代码中尝试绑定一个名为 WindowResize 的函数,但是在这个位置,Python 识别不出这个函数的名字。

这个错误的原因是,你在 WindowResize 函数的定义之前就尝试绑定了它。为了解决这个问题,你可以将 bind 语句放到 WindowResize 函数定义之后执行,例如:

if __name__ == '__main__':
    gui = GUI()
    gui.window.bind('<configure>', gui.WindowResize)
    gui.window.mainloop()

这样就可以正确地绑定 WindowResize 函数了。

注意,在 WindowResize 函数中,你使用了全局变量 save_width 和 save_height,但是这两个变量在函数外并没有被定义。如果你希望在函数中使用这两个变量,需要将它们改为类的实例变量,例如:

import tkinter as tk
 
class GUI:
    def __init__(self):
        self.window = tk.Tk()
        self.window.title("Frame test")        
        width = 400
        height = 400
        self.g_screenwidth = self.window.winfo_screenwidth()
        self.g_screenheight = self.window.winfo_screenheight()
        self.alignstr = '%dx%d+%d+%d' % (width, height, (self.g_screenwidth-width)/2, (self.g_screenheight-height)/2)
        self.window.geometry(self.alignstr) 
        self.window.config(bg='gray')
        self.window.minsize(width, height)        
        self.frame1 = tk.Frame(self.window, width=360, height=340)
        self.frame1.pack_propagate(0)
        self.frame1.place(x=20, y=10)
        # 将 save_width 和 save_height 初始化为类的实例变量
        self.save_width = 0
        self.save_height = 0
 
    def WindowResize(self, event):
        # 不再需要 global 关键字
        new_width = self.window.winfo_width()
        new_height = self.window.winfo_height()        
        if new_width == 1 and new_height == 1:
            return
        if self.save_width != new_width or self.save_height != new_height:
            self.frame1.config(width=new_width-40, height=new_height-60)
            self.button1.place(x=20, y=new_height-40)
        self.save_width = new_width
        self.save_height = new_height
 
if __name__ == '__main__':
    gui = GUI()
    gui.window.bind('<Configure>', gui.WindowResize)
    gui.window.mainloop()