- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在努力重写一段工作代码,我以更面向对象的方式编写,并且不知道如何将字体(显示位置)附加到 3 个移动矩形。换句话说,当我移动这些矩形时,我希望将数字及其位置附加到每个矩形上。强烈建议任何改进此代码的建议。
import sys
import pygame as pg
WIDTH = 800
HEIGHT = 600
WHITE = (255, 255, 255)
SCREEN = pg.display.set_mode((WIDTH, HEIGHT))
clock = pg.time.Clock()
pg.font.init()
class Rectangle(pg.sprite.Sprite):
def __init__(self, color, width, height, x , y):
super().__init__()
self.width = width
self.height = height
self.color = color
self.image = pg.Surface((width, 3*140 + height),pg.SRCALPHA)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
for z in range(0, 3 * 140, 140):
pg.draw.rect(self.image, color, (0, z, self.width, self.height))
def draw(self, screen):
screen.blit(self.image, self.rect)
return int(self.rect.y)
def update(self):
self.rect.y += event.rel[1]
def rect_y(self):
return self.rect.y
class Font(Rectangle):
def __init__(self, color, width, height, x , y):
super().__init__( color, width, height, x , y)
self.font_a = pg.font.Font(None, 20)
self.text = self.font_a.render(str(abs(int(object1.rect_y()))), True, (0,0,0))
self.text_rect = self.text.get_rect()
self.text_rect.y = Rectangle.rect_y(self)
object1 = Rectangle((50,100,100), 30, 100, 110 , 120)
selected1 = False
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
elif event.type == pg.MOUSEBUTTONDOWN:
if object1.rect.collidepoint(event.pos):
selected1 = True
elif event.type == pg.MOUSEBUTTONUP:
selected1 = False
elif event.type == pg.MOUSEMOTION:
if selected1:
object1.update()
SCREEN.fill(WHITE)
font1 = Font((50,100,100), 30, 100, 110 , 120)
SCREEN.blit(font1.text, font1.rect)
object1.draw(SCREEN)
pg.display.update()
clock.tick(60)
if __name__ == '__main__':
pg.init()
pg.quit()
sys.exit()
最佳答案
我将 Font
对象(我将该类重命名为 Label
)作为属性添加到 Rectangle
实例。如果您需要多个标签,可以将它们放入列表中。我为 Rectangle
提供了 handle_event
方法,将 MOUSEMOTION
事件传递给该方法以更新其 self.rect
,然后矩形将事件传递给其标签,以便它们可以更新其位置。
要存储 Sprite 实例,您可以使用pygame.sprite.Group
(示例中的all_sprites
),它允许您通过调用更新所有包含的 Sprite >all_sprites.update()
和 all_sprites.draw(SCREEN)
。 all_sprites.update()
在这种情况下实际上是无用的,因为 Sprite 没有 update
方法(我只是想向您展示如何在主程序中调用它)循环)。
import pygame as pg
pg.init()
WHITE = (255, 255, 255)
SCREEN = pg.display.set_mode((800, 600))
FONT_A = pg.font.Font(None, 20)
clock = pg.time.Clock()
class Rectangle(pg.sprite.Sprite):
def __init__(self, color, width, height, x, y, all_sprites):
super().__init__()
self.color = color
self.image = pg.Surface((width, 3*140 + height), pg.SRCALPHA)
self.rect = self.image.get_rect(topleft=(x, y))
# If you need multiple labels, you can put them into a list.
# You could also create and add them in the for loop below.
self.labels = [Label(self.rect.right+3, self.rect.top, (0,0,0)),
Label(self.rect.right+3, self.rect.top+140, (0,0,0))]
all_sprites.add(self.labels)
for z in range(0, 3*140, 140):
pg.draw.rect(self.image, color, (0, z, width, height))
def handle_event(self, event):
self.rect.y += event.rel[1]
# Pass the event to the labels, so that they can handle it themselves.
for label in self.labels:
label.handle_event(event)
class Label(pg.sprite.Sprite):
def __init__(self, x, y, color):
super().__init__()
self.color = color
self.image = FONT_A.render(str(abs(y)), True, self.color)
self.rect = self.image.get_rect(topleft=(x, y))
def handle_event(self, event):
self.rect.y += event.rel[1]
self.image = FONT_A.render(str(abs(self.rect.y)), True, self.color)
def main():
# Create a sprite group which will contain all sprite instances.
# To update and draw the sprites you can just call its .update and .draw
# methods.
all_sprites = pg.sprite.Group()
# Pass the group to the Rectangle, because we need to add the labels.
object1 = Rectangle((50,100,100), 30, 100, 110, 120, all_sprites)
all_sprites.add(object1)
selected1 = False
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
elif event.type == pg.MOUSEBUTTONDOWN:
if object1.rect.collidepoint(event.pos):
selected1 = True
elif event.type == pg.MOUSEBUTTONUP:
selected1 = False
elif event.type == pg.MOUSEMOTION:
if selected1:
# Pass the event to the object's handle_event method,
# where it uses it to update its rect and labels.
object1.handle_event(event)
all_sprites.update()
SCREEN.fill(WHITE)
all_sprites.draw(SCREEN)
pg.display.update()
clock.tick(60)
if __name__ == '__main__':
main()
pg.quit()
<小时/>
附录:如果所有标签应显示相同的值(在本例中为矩形的顶部位置),您可以将此值传递给标签实例并将其添加为属性。然后也在 handle_event
方法中更新它并使用它来渲染字体表面。
class Rectangle(pg.sprite.Sprite):
def __init__(self, color, width, height, x, y, all_sprites):
super().__init__()
self.color = color
self.image = pg.Surface((width, 3*140 + height), pg.SRCALPHA)
self.rect = self.image.get_rect(topleft=(x, y))
# Pass another argument (the `value`) to the labels.
self.labels = [Label(self.rect.right+3, self.rect.top, self.rect.top, (0,0,0)),
Label(self.rect.right+3, self.rect.top+140, self.rect.top, (0,0,0))]
all_sprites.add(self.labels)
for z in range(0, 3*140, 140):
pg.draw.rect(self.image, color, (0, z, width, height))
def handle_event(self, event):
self.rect.y += event.rel[1]
for label in self.labels:
label.handle_event(event)
class Label(pg.sprite.Sprite):
def __init__(self, x, y, value, color):
super().__init__()
self.value = value
self.color = color
self.image = FONT_A.render(str(abs(self.value)), True, self.color)
self.rect = self.image.get_rect(topleft=(x, y))
def handle_event(self, event):
# Update the self.value as well and use it to render the new font surface.
self.value += event.rel[1]
self.rect.y += event.rel[1]
self.image = FONT_A.render(str(abs(self.value)), True, self.color)
关于python - 如何使用类显示与矩形位置相关的字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45899617/
我正在尝试获取从过去的 startposition/location 到当前移动的 currentposition/location 的距离(以米为单位)。 我确实有工作正常的currentposit
所以我有一堆绝对覆盖的 div。用户通过在叠加层上拖动来创建方形 div。如果您要创建一个 div,然后放大和缩小,div 会保持在同一位置,因为它对叠加层是绝对的,如前所述。 然而问题就出在这里。您
我想找到 View 在显示屏幕上的位置。 为此,我使用了 view.getLeft() 、view.getBottom() 、view.getRight() 等方法> , view.getTop()。
我有一个看起来像这样的 View 层次结构(基于其他答案和 Apple 的使用 UIScrollView 的高级 AutoLayout 指南): ScrollView 所需的2 个步骤是: 为 Scr
所以我有一个名为 MARKS 的表,我有这些列 STUDENT_ID, CLASSFORM_NAME, ACADEMIC_YEAR, TERM, SUBJECT_NAME, TOTAL_MARKS
我有一个问题我无法理解,请帮助: 我开发了带有图像的 html 页面,并使用 jQuery UI 帮助使它们可拖动,我将这些图像位置设置为相对位置并给出了左侧和顶部像素,这是页面的链接 http://
我正在尝试创建一个 CSS 动画,它在 sprite 表中循环播放 16 个图像,给人一种幽灵“漂浮”的错觉。动画通过在 background-position 位置之间移动以显示不同状态的幽灵来实现
我正在创建这个网站的 WebView https://nearxt.com/打开时询问位置但是当我使用此链接在 flutter 中创建 webview 时那么它就无法定位我还在应用程序中定义了位置,但
我正在以编程方式创建一个需要跨越 2 个屏幕的窗口。正在创建的窗口的大小是正确的,但窗口大约从第一个屏幕的一半开始。我可以将它拖回第一个屏幕的开头,NSWindow 非常适合。 我只需要知道在窗口的起
位置“/”的匹配叶路由没有元素。这意味着默认情况下它将呈现一个空值,从而导致一个“空”页面 //App.js File import { BrowserRouter as Router, Routes
我有一个运行 Ubuntu 和 Apache 的 VPS 例如,假设地址是:5.5.5.5 在 VPS 上,我有一个名为 eggdrop 的用户(除了我的 root 用户)。 用户 eggdrop 有
我有一个 JLabel与 ImageIcon ,我使用 setIcon() JLabel中的函数. ImageIcon然后上来,坐在我的JLabel 的文字左侧.是否有可能拥有 ImageIcon在文
我的图中有节点,它们的 xlabels 位于它们的左上方。我怎样才能改变这个位置?我希望 xlabels 正好位于节点本身的旁边。 最佳答案 xlp是你想要的属性,但它没有做任何事情。 你不能改变位置
我对基本的 VIM 功能有疑问:(我尝试谷歌搜索但找不到答案) 如何列出所有自定义功能。(我做了 :function 并且不能找到我的自定义函数) 如何获得自定义函数列表中的函数(或它们的存储位置)。
我是 PHP 的新手,虽然我一直在搜索,但我不知道该怎么做。 我知道可以使用 Location("some page") 进行重定向。我还读到,只要没有向用户显示任何内容,它就可以工作。 我想做的是:
如果在 jgrowl.css 中位置更改为“center”,我如何将其覆盖为默认值,即“top-right” $.jGrowl(data, { header: 'data', an
我需要根据用户是否滑动屏幕顶部、屏幕中间或屏幕底部来触发不同的事件。我正在尝试找出最好/最简单的方法来做到这一点,因为我很确定没有办法从 UISwipeGestureRecognizer 获取位置。
我需要枚举用delphi编写的外部应用程序中使用的类 ,因此我需要访问VMT表以获取该信息,但是我找不到任何有关如何在exe(由delphi生成)文件中找到VMT(虚拟方法表)的位置(地址)的文档。
在 D2010 (unicode) 中是否有像 Pos 这样不区分大小写的类似函数? 我知道我可以使用 Pos(AnsiUpperCase(FindString), AnsiUpperCase(Sou
我正在尝试为我的reveal.js 演示文稿制作一个标题,该标题会粘贴在屏幕顶部。标题中的内容在每张幻灯片的基础上都是动态的,因此我必须将标记放在 section 标记中。 显然,如果标记在 sect
我是一名优秀的程序员,十分优秀!