如何使窗口在触摸屏幕边缘时弹回(修补程序)

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 Trueupdate,使用mainloopafter“循环” 【参考方案1】:

如果您需要修改全局变量,请不要将它们作为参数传递。相反,添加

def movewin(win):
    global velx
    global vely

在函数的顶部。

大跟进

您的应用中更重要的问题与坐标有关。 root.winfo_x()root.winfo_y() 不要返回窗口的左上角。相反,它们返回可绘制区域的左上角、边框内和标题栏下方。这搞砸了你的绘图,意味着你试图定位到屏幕底部,而 Tkinter 会修复它。

这里的解决方案是自己跟踪 x 和 y 位置,而不是从 Tk 中获取它们。

Tkinter 主要是垃圾。查看pygame 以获得简单的游戏,或查看真正的GUI 系统,如QtwxPython 以获得应用程序,您会得到更好的服务。

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)

【讨论】:

以上是关于如何使窗口在触摸屏幕边缘时弹回(修补程序)的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用程序中的按钮不响应屏幕边缘的触摸

触摸事件仅在 iOS 9 的左屏幕边缘附近延迟。如何解决?

SwiftUI - 使列表分隔线扩展到触摸屏边缘

使 iPad 屏幕关闭,但通过触摸唤醒(无锁定) - - iOS 6.0 / openFrameworks

在视图底部边缘触摸未注册 (iOS)

当用户触摸屏幕的特定部分时如何触发事件 - ios?