Python tkinter bind如何在class 中绑定函数
NameError: name 'WindowResize' is not defined
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
如何绑定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()