jian1121csdn 2023-01-09 23:28 采纳率: 50%
浏览 11
已结题

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('<configure>', WindowResize)这行代码是错误的
    gui.window.bind('<configure>', WindowResize)
    gui.window.mainloop()

运行结果及详细报错内容

NameError: name 'WindowResize' is not defined

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

如何绑定WindowResize函数

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

1条回答 默认 最新

  • ShowMeAI 2023-01-09 23:58
    关注

    看起来你在 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()
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月18日
  • 已采纳回答 1月10日
  • 创建了问题 1月9日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改