如何使窗口在触摸屏幕边缘时弹回(修补程序)
Posted
技术标签:
【中文标题】如何使窗口在触摸屏幕边缘时弹回(修补程序)【英文标题】:How to make a window bounce back when it touches edge of screen (tinker) 【发布时间】:2022-01-20 21:04:25 【问题描述】:这是我的代码:
from time import sleep
from tkinter import *
def moveWin(win, velx, vely):
x = win.winfo_x()
y = win.winfo_y()
win.geometry(f"+str(x + velx)+str(y + vely)")
downx, downy = x+width, y+height
global sWidth
global sHeight
if x <= 0 or downx >= sWidth:
velx = -velx
if y <= 0 or downy >= sHeight:
vely = -vely
return [x, y, downx, downy]
root = Tk()
width = 300
height = 300
velx = 1
vely = 1
sWidth = root.winfo_screenwidth() # gives 1366
sHeight = root.winfo_screenheight() # gives 1080
root.geometry("+250+250")
while True:
root.update()
root.geometry("300x300")
pos = moveWin(root, velx, vely)
print(pos)
sleep(0.01)
我想在窗口触摸屏幕边缘时弹回它,但它刚刚离开屏幕 我的代码有什么问题? 请帮忙
【问题讨论】:
顺便说一句,不要使用while True
和update
,使用mainloop
和after
“循环”
【参考方案1】:
如果您需要修改全局变量,请不要将它们作为参数传递。相反,添加
def movewin(win):
global velx
global vely
在函数的顶部。
大跟进
您的应用中更重要的问题与坐标有关。 root.winfo_x()
和 root.winfo_y()
不要返回窗口的左上角。相反,它们返回可绘制区域的左上角、边框内和标题栏下方。这搞砸了你的绘图,意味着你试图定位到屏幕底部,而 Tkinter 会修复它。
这里的解决方案是自己跟踪 x 和 y 位置,而不是从 Tk 中获取它们。
Tkinter 主要是垃圾。查看pygame
以获得简单的游戏,或查看真正的GUI 系统,如Qt
或wxPython
以获得应用程序,您会得到更好的服务。
from time import sleep
from tkinter import *
class Window(Tk):
def __init__(self):
Tk.__init__(self)
self.width = 300
self.height = 300
self.velx = 1
self.vely = 1
self.pos = (250,250)
self.geometry(f"self.widthxself.height+self.pos[0]+self.pos[1]")
def moveWin(self):
x = self.pos[0] + self.velx
y = self.pos[1] + self.vely
downx, downy = x+self.width, y+self.height
sWidth = self.winfo_screenwidth() # gives 1366
sHeight = self.winfo_screenheight() # gives 1080
if x <= 0 or downx >= sWidth:
self.velx = -self.velx
if y <= 0 or downy >= sHeight:
self.vely = -self.vely
self.pos = (x,y)
self.geometry(f"+x+y")
return [x, y, downx, downy]
root = Window()
while True:
root.update()
pos = root.moveWin()
print(pos)
sleep(0.01)
【讨论】:
以上是关于如何使窗口在触摸屏幕边缘时弹回(修补程序)的主要内容,如果未能解决你的问题,请参考以下文章