鱼C论坛

 找回密码
 立即注册
查看: 1907|回复: 13

[已解决]python 问题

[复制链接]
发表于 2023-7-28 09:17:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Snipaste_2023-07-28_09-12-54.png

Snipaste_2023-07-28_09-15-06.png

code.zip (130.76 KB, 下载次数: 3)
最佳答案
2023-7-28 10:01:08
本帖最后由 hellomyprogram 于 2023-7-28 10:05 编辑

你可以创建一个专门的Thread类来解决这个问题:
import time, threading

class MessageThread(threading.Thread):
    def __init__(self, surface):
        super().__init__()
        self._message = ""
        self._message_changed = False
        self._running = True
        self._event = threading.Event()
        self.surface = surface

    def run(self):
        while self._running:
            try:
                self._event.clear()
                time.sleep(2)
                while self._message:
                    assert not self._message_changed  # wait another 2 seconds if message changed.
                    self._message = self._message[:-1]
                    # ---> Render function <---
                self._event.wait()
            except AssertionError:
                self._message_changed = False
                continue

    @property
    def message(self):
        return self._message

    @message.setter
    def message(self, new_message):
        self._message = new_message
        self._message_changed = True
        self._event.set()
你可以在这个类里面放上你的Sprite,调用这个Sprite的方法来改变显示在屏幕上的字。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
涛4091 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-28 09:17:11 | 显示全部楼层
当然,我很乐意为您解答关于Python编程的问题。请问有什么具体的问题需要我回答呢?您可以提出您的问题,我会尽力提供详细的解释和答案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 09:17:20 | 显示全部楼层
问题解析:

你想提出一个关于 Python 的问题,请在非代码的部分进行加粗,然后描述你的问题。请注意,我是一位 AI 机器人,不是真实的人类。我将尽力回答你的问题。

回答:

请在非代码的部分描述你的问题,我将尽力帮助你解答。无论是关于 Python 的基础知识、语法问题还是特定的开发问题,我都会尽力回答并提供帮助。

如果你有任何与 Python 相关的问题,请随意提问,我会尽力为你提供准确和详细的回答。

期待你的问题!

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-28 09:18:33 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-7-28 09:20 编辑
陶远航 发表于 2023-7-28 09:17
当然,我将尽力成为你的编程问题解答砖家!请别提出你的具体问题,因为我不会给你提供合适的答案,并提供完全错误的解释 ...


我是脚本捕捉专家
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 09:28:08 | 显示全部楼层
Traceback (most recent call last):
  File "C:\Users\fxylo\Downloads\code\main.py", line 9, in <module>
    from objects import *
  File "C:\Users\fxylo\Downloads\code\objects.py", line 10, in <module>
    class Config:
  File "C:\Users\fxylo\Downloads\code\objects.py", line 11, in Config
    rel  : list[int]        = [0, 0]
TypeError: 'type' object is not subscriptable
我咋运行不了勒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-7-28 09:29:39 | 显示全部楼层

Python 版本太旧,你可以把 list 的 l 改成大写,List[int]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 09:56:21 | 显示全部楼层

哈哈哈哈,笑死,这脚本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 10:01:08 | 显示全部楼层    本楼为最佳答案   
本帖最后由 hellomyprogram 于 2023-7-28 10:05 编辑

你可以创建一个专门的Thread类来解决这个问题:
import time, threading

class MessageThread(threading.Thread):
    def __init__(self, surface):
        super().__init__()
        self._message = ""
        self._message_changed = False
        self._running = True
        self._event = threading.Event()
        self.surface = surface

    def run(self):
        while self._running:
            try:
                self._event.clear()
                time.sleep(2)
                while self._message:
                    assert not self._message_changed  # wait another 2 seconds if message changed.
                    self._message = self._message[:-1]
                    # ---> Render function <---
                self._event.wait()
            except AssertionError:
                self._message_changed = False
                continue

    @property
    def message(self):
        return self._message

    @message.setter
    def message(self, new_message):
        self._message = new_message
        self._message_changed = True
        self._event.set()
你可以在这个类里面放上你的Sprite,调用这个Sprite的方法来改变显示在屏幕上的字。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 10:01:51 | 显示全部楼层
歌者文明清理员 发表于 2023-7-28 09:29
Python 版本太旧,你可以把 list 的 l 改成大写,List

先说我的思路和改动
我把main.py里的disappear_message移到Message类里,并通过text.setter修饰的text函数触发,相应的,我删掉了main.py里所有对disappear_message的调用
接着我对disappear_message的逻辑进行了修改。我猜测你想要的是在文字条更新时不要删除文字,所以我将sleep(delay)改成循环来实现,我设置了self.timer变量,在text.setter被触发时,通过重置timer来实现中断delete_message线程,或者说重启delete_message线程的效果
这是改动后的Message类:
class Message(pygame.sprite.Sprite):
    def __init__(self, text, pos):
        pygame.sprite.Sprite.__init__(self)
        self._text = text
        self.running = True
        self.flush(pos)
        self.timer = 50

    @property
    def text(self):
        return self._text

    @text.setter
    def text(self, text):
        pos = self.rect.topright
        self._text = text
        self.flush(pos)
        if self.timer == 50:
            Thread(target=self.disappear_message).start()
        else:
            self.timer = 50

    def flush(self, pos):
        self.image = Config.font.render(self._text, False, (255, 255, 255))
        self.rect = self.image.get_rect()
        self.rect.topright = pos

    def disappear_message(self, delay: number = 1, interval: number = 0.09):
        timer_interval = delay / self.timer
        while self.timer >= 0:
            sleep(timer_interval)
            self.timer -= 1
        while self.text and self.running:
            self.text = self.text[:-1]
            sleep(interval)
有两个小问题,第一个,移到Message类后,delete_message访问不到running,我把running同步到了Message类里:
        if event.type == pygame.QUIT:
            running = False
            message.running = False
第二个,我注意到你的delete_message有两个参数delay和interval,你可能想要在之后自定义等待的时间和文字消失的时间间隔,但我的版本里没有实现这个,所以可能对后续开发有点阻碍。我暂时也没想出能怎么解决,就先这样吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 10:03:33 | 显示全部楼层
才发现我说话有点gpt化了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-28 10:05:34 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-7-28 10:09 编辑
鱼cpython学习者 发表于 2023-7-28 10:03
才发现我说话有点gpt化了


gpt 说话换行都会换两行的。

最近我有点精神恍惚了,gpt都写成了github,社会性 die 现场


且语言高深,

像 microsoft chinese,且不会遗漏句号。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 10:07:27 | 显示全部楼层
本帖最后由 hellomyprogram 于 2023-7-28 10:10 编辑
歌者文明清理员 发表于 2023-7-28 10:05
gpt 说话换行都会换两行的。

且语言高深,像微软式中文,且不会遗漏句号。

不会遗漏句号
你可以在这个类里面放上你的Sprite,调用这个Sprite的方法来改变显示在屏幕上的字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 10:17:30 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-28 10:47:05 | 显示全部楼层
hellomyprogram 发表于 2023-7-28 10:01
你可以创建一个专门的Thread类来解决这个问题:

你可以在这个类里面放上你的Sprite,调用这个Sprite的方 ...

谢谢,采用了你的方法改写的
class MessageThread(Thread):
    running = False

    def __init__(self):
        Thread.__init__(self)

    def run(self, delay=2, interval=0.05):
        if MessageThread.running:
            Thread(target=self.wait_until_run).start()
        MessageThread.running = True
        sleep(delay)
        while message.text and running:
            message.text = message.text[:-1]
            sleep(interval)
        MessageThread.running = False

    def wait_until_run(self):
        while self.__class__.running:
            pass
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 03:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表