Tkinter如何设置仅输入框有内容后触发按钮移动动画 启动即动问题排查
代码存在的问题
- 判断输入框是否有内容的逻辑错误
你直接将E1这个Entry控件实例和空字符串做比较,二者类型完全不同,E1 != ""的结果永远为True,所以程序启动后循环会直接执行,按钮自然从一开始就移动。要获取输入框内的文本内容,需要调用E1.get()方法。 - 动画更新逻辑不符合Tkinter的运行机制
你使用while循环+time.sleep()的写法会阻塞Tkinter的主事件循环,会导致输入框无法响应用户输入、界面卡顿的问题,正确做法是用Tkinter自带的after()方法实现定时更新。 - 原代码还有语法格式问题:while循环下的代码没有缩进,运行会直接报错。
修复后的完整代码
from tkinter import * WIDTH = 500 HEIGHT = 500 xVelocity = 1 yVelocity = 1 window = Tk() canvas = Canvas(window, width=WIDTH, height=HEIGHT) canvas.pack() # 创建输入框 E1 = Entry(window) canvas.create_window(200, 150, window=E1) btn = Button(canvas, text='Click me!', width=10, height=2, command=window.destroy) button_image = canvas.create_window(0, 0, window=btn, anchor=NW) def move_button(): global xVelocity, yVelocity # 仅当输入框有内容时才移动按钮 if E1.get().strip() != "": coordinates = canvas.coords(button_image) if coordinates[0] >= (WIDTH - 75) or coordinates[0] < 0: xVelocity = -xVelocity if coordinates[1] >= (HEIGHT - 35) or coordinates[1] < 0: yVelocity = -yVelocity canvas.move(button_image, xVelocity, yVelocity) # 每10ms调用一次自身,实现持续更新 window.after(10, move_button) # 启动更新逻辑 move_button() window.mainloop()
内容的提问来源于stack exchange,提问作者user29617
相关产品推荐
相关产品推荐

