RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题

全部问题

Martin Hope
Flevtek
Asked: 2025-01-09 05:35:23 +0000 UTC

向电报发送错误消息 [PyQt5]

  • 5

我正在尝试将发送错误消息集成到 PyQt5 内的电报中。我输入了 ctrl+x 组合来创建错误。此后,应创建一个具有 win 属性的文件并将其与 Traceback 文本一起发送。我试过:

import io
import sys
import asyncio
import traceback
import keyboard as k
from telegram import Bot
from qasync import QEventLoop
from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox


TELEGRAM_TOKEN = 'TOKEN'
CHAT_ID = 'ID'

class Main_widget(QWidget):
    def __init__(self):
        super().__init__()
        self.x = 1
        k.hook_key('ctrl', lambda e: self.switch(e))
        k.hook_key('x', lambda e: self.check(e))
        self.show()
    def switch(self, e):
        if 'down' in str(e):
            self.temp = True
        else:
            self.temp = False
    def check(self, e):
        if self.temp and 'down' in str(e):
            try:
                if e.name == 'x':
                    aa = 5 / 0
            except:
                ex_type, ex_val, ex_tb = sys.exc_info()
                excepthook(ex_type, ex_val, ex_tb)

async def send_report(tb, lines):
    bot = Bot(token=TELEGRAM_TOKEN)
    file_content = "\n".join(lines) or "Нет данных"
    file_stream = io.StringIO(file_content)
    file_stream.name = "attributes.txt"
    try:
        await bot.send_document(
            chat_id=CHAT_ID,
            document=file_stream,
            caption=f"Сообщение об ошибке:\n{tb}"
        )
    except Exception as e:
        print(f"Ошибка отправки в Telegram: {e}")
    finally:
        file_stream.close()


def excepthook(exc_type, exc_value, exc_tb):
    tb = "".join(traceback.format_exception(exc_type, exc_value, exc_tb))
    lines = []
    if win:
        for name, value in win.__dict__.items():
            if not callable(value) and not name.startswith("__"):
                lines.append(f"{name}: {value}")
    msg = QMessageBox()
    msg.setIcon(QMessageBox.Critical)
    msg.setWindowTitle("Ошибка")
    msg.setText("Во время работы программы возникла ошибка.")
    report = msg.addButton('Сообщить об ошибке и выйти', msg.ActionRole)
    report.clicked.connect(lambda: send_report(tb, lines))
    win.close()
    msg.show()

sys.excepthook = excepthook

if __name__ == "__main__":
    app = QApplication(sys.argv)
    loop = QEventLoop(app)
    asyncio.set_event_loop(loop)
    win = Main_widget()

    with loop:
        loop.run_forever()

当代码显示错误消息时,主窗口将关闭,并且不会发生任何其他事情,尽管程序仍在运行。请帮我弄清楚

python
  • 1 个回答
  • 30 Views
Martin Hope
deso
Asked: 2025-01-09 03:18:33 +0000 UTC

如何在捕获可变消息后禁用处理程序

  • 5
@router.message()
async def reg_step1(message: Message):
    async with (lock):
        name = message.text
    await message.answer(f"Приятно познакомиться, {name}. Подскажи, хочется сразу перейти к урокам или посмотреть бесплатный урок «Управление первым впечатлением»?",
                         reply_markup=kb)

执行该函数后必须使其不再有反应。求助,这个怎么办?

python
  • 1 个回答
  • 25 Views
Martin Hope
AsLimbo
Asked: 2025-01-09 02:33:55 +0000 UTC

如何正确实现时间重置功能?

  • 6

有一个函数可以使用 time 模块将输入的时间转换为秒:

def set_time(
        Y=localtime(time())[0],
        m=localtime(time())[1],
        d=localtime(time())[2],
        H=localtime(time())[3],
        M=localtime(time())[4],
        S=localtime(time())[5]):
    Y_f = Y
    m_f = m
    d_f = d
    H_f = H
    M_f = M
    S_f = S
    
    formats = f"%Y-%m-%d %H:%M:%S"
    date_format = f'{Y_f}-{m_f}-{d_f} {H_f}:{M_f}:{S_f}'
    print(date_format)
    date_format_struct = strptime(date_format, formats)
    date_format_like_seconds_f = mktime(date_format_struct)
    return date_format_like_seconds_f

用户有机会输入并非所有参数 - 在这种情况下,未输入的参数将设置为默认值。并且右边缘的参数全部填写也没有问题,例如:

set_time(H=15, M=10, S=10)
#Вывод : 2025-1-8 15:10:10

然而,例如,如果用户只输入小时,则小时参数右侧的时间将被设置为触发该功能时的时间,这是不可接受的。

set_time(H=15)
#Вывод : 2025-1-8 15:19:2

我试图确保输入参数右侧的时间重置为零,即它等于“00”或“01”,并且输入参数左侧的时间始终设置到现在。也就是说,当输入set_time(H=15)时,参数M和S将等于“00”,参数d、m、Y将等于当前时间。我使用 match/case 实现了以下解决方案:

def set_time(
        Y=localtime(time())[0],
        m=localtime(time())[1],
        d=localtime(time())[2],
        H=localtime(time())[3],
        M=localtime(time())[4],
        S=localtime(time())[5]):
    Y_f = Y
    m_f = m
    d_f = d
    H_f = H
    M_f = M
    S_f = S

    YYf = localtime(time())[0] == Y_f
    mmf = localtime(time())[1] == m_f
    ddf = localtime(time())[2] == d_f
    HHf = localtime(time())[3] == H_f
    MMf = localtime(time())[4] == M_f
    SSf = localtime(time())[5] == S_f
    print(YYf, mmf, ddf, HHf, MMf, SSf)

    match YYf, mmf, ddf, HHf, MMf, SSf:

        case True, True, True, True, False, True:
            S_f = '00'
            print('Минуты ')
        case True, True, True, False, False, True:
            S_f = '00'
            print('Минуты ')
        case True, True, False, False, False, True:
            S_f = '00'
            print('Минуты ')
        case True, False, False, False, False, True:
            S_f = '00'
            print('Минуты ')
        case False, False, False, False, False, True:
            S_f = '00'
            print('Минуты')

        case True, True, True, False, True, True:
            print('Часы ')
            M_f = '00'
            S_f = '00'
        case True, True, False, False, True, True:
            print('Часы ')
            M_f = '00'
            S_f = '00'
        case True, False, False, False, True, True:
            print('Часы ')
            M_f = '00'
            S_f = '00'
        case False, False, False, False, True, True:
            print('Часы ')
            M_f = '00'
            S_f = '00'

        case  True, True, False, True, True, True:
            print('Дни ')
            H_f = '00'
            M_f = '00'
            S_f = '00'
        case  True, False, False, True, True, True:
            print('Дни ')
            H_f = '00'
            M_f = '00'
            S_f = '00'
        case False, False, False, True, True, True:
            print('Дни ')
            H_f = '00'
            M_f = '00'
            S_f = '00'

        case True, False, True, True, True, True:
            print('Месяцы ')
            d_f = '01'
            H_f = '00'
            M_f = '00'
            S_f = '00'
        case False, False, True, True, True, True:
            print('Месяцы ')
            d_f = '01'
            H_f = '00'
            M_f = '00'
            S_f = '00'

        case False, True, True, True, True, True:
            print('Года ')
            m_f = '01'
            d_f = '01'
            H_f = '00'
            M_f = '00'
            S_f = '00'

    formats = f"%Y-%m-%d %H:%M:%S"
    date_format = f'{Y_f}-{m_f}-{d_f} {H_f}:{M_f}:{S_f}'
    print(date_format)
    date_format_struct = strptime(date_format, formats)
    date_format_like_seconds_f = mktime(date_format_struct)
    return date_format_like_seconds_f

但它有一个缺点 - 如果您在同一时间点运行该函数,则匹配表达式将不正确并且将选择错误的情况。例如,如果您在 21:24 运行该函数,之前输入了参数 H=21、M=24,则 match 中的大小写将相当于 True、True、True、True、True、True,结果不会匹配。如果您能告诉我如何正确解决这个问题,我将不胜感激)理论上,如果有一种方法可以将用户输入参数的响应和设置默认参数的响应分开,一切都会更简单,但我不这样做不知道这样的方法。
PS:
我根据@DiHASTRO的答案重新表述了条件,它将正常工作(请参阅代码中的注释):

from time import *


def set_time(
    Y=None,
    m=None,
    d=None,
    H=None,
    M=None,
    S=None,
):
    TIME_PARAMS_COUNT = 6
    TIME_PARAMS_MINIMUMS = ['0000', '01', '01', '00', '00', '00']
    time_params = [Y, m, d, H, M, S]
    if time_params == [None, None, None, None, None, None]:
        time_params = [localtime(time())[0], localtime(time())[1], localtime(time())[2], localtime(time())[3],
                       localtime(time())[4], localtime(time())[5]]

    was_time_param_set = False
    for i in range(TIME_PARAMS_COUNT - 1, -1, -1):

        # 3) вхождение
        if was_time_param_set is True:
            while  time_params[i] is None:
                time_params[i] = localtime(time())[i]

        # 2) второе вхождение
        if time_params[i] is not None:
            was_time_param_set = True

        # 1) первое вхождение
        while time_params[i] is None and was_time_param_set is False:
            time_params[i] = TIME_PARAMS_MINIMUMS[i]

# Алгоритм следующий, происходит последовательная итерация по TIME_PARAMS_COUNT. ( 1) вхождение )Пока значения в time_params[i] is None и was_time_param_set is False
# time_params[i] обнуляется. Как только в в одной из итераций time_params[i] становится не равен None(то есть мы натыкаемся на введённые параметры), ключ was_time_param_set
# переключается на True( 2) вхождение). Введённые параметры при итерации по ним никак не изменяются. Происходит ( 3) вхождение ) в котором цикл while изменяет на localtime(time())[i]
# параметры после введённых, равные None.

    formats = f"%Y-%m-%d %H:%M:%S"
    Y_f, m_f, d_f, H_f, M_f, S_f = time_params
    date_format = f'{Y_f}-{m_f}-{d_f} {H_f}:{M_f}:{S_f}'
    print(date_format)
    date_format_struct = strptime(date_format, formats)
    date_format_like_seconds_f = mktime(date_format_struct)
    return date_format_like_seconds_f

if __name__ == '__main__':
    set_time(H=18, M=45, S=21)
    set_time(M=45, S=21)
    set_time(S=21)
    set_time()
    set_time(H=18)
    set_time(H=18, M=45)
#Вывод:
# 2025-1-9 18:45:21
# 2025-1-9 21:45:21
# 2025-1-9 21:3:21
# 2025-1-9 21:3:2
# 2025-1-9 18:00:00
# 2025-1-9 18:45:00
python
  • 2 个回答
  • 74 Views
Martin Hope
IlayVanse
Asked: 2025-02-09 01:26:12 +0000 UTC

授权后如何监控websocket连接的有效性?

  • 5

为了实时通知客户,我决定使用WS,但数据安全的问题出现了。在 http 请求中,每次请求都会发生授权,传输 JWT 令牌,从而控制对帐户和资源的访问。

使用 WS,可以通过在第一条消息中发送令牌并从服务器接收结果来执行授权;如果一切正常,则可以继续连接并将信息发送到客户端。

接下来,如何确保用户在授权后仍然有访问权限?例如,用户可以退出帐户(在这种情况下,令牌会被列入黑名单),更改密码或者访问权限可以更改,因为在此之后,http 请求将不起作用,但 WS 连接将保留,这是不好的。

这个问题该如何解决?

python
  • 1 个回答
  • 33 Views
Martin Hope
Anonumous1245
Asked: 2025-01-09 00:08:27 +0000 UTC

为什么 Slot() 不能捕获 Signal 值?

  • 6

有一段代码:

from PySide6 import QtCore
from PySide6 import QtWidgets


class Sender(QtWidgets.QMainWindow):
    signal = QtCore.Signal(int)
    def __init__(self):
        super().__init__()
    
    def Emmit(self):
        self.signal.emit(666)


class Recivier(QtWidgets.QWidget):
    def __init__(self,):
        super().__init__()

   @QtCore.Slot(int)
    def recive(self, value):
        print(value)


app = QtWidgets.QApplication([])
sen = Sender()
rec = Recivier()
sen.signal.connect(Recivier.recive)
sen.Emmit()
app.exec()

当尝试输出传递的值时,出现错误:

类型错误:Recivier.recive() 缺少 1 个必需的位置参数:“值”

这是它的工作原理吗?如果不是,它实际上是如何工作的以及在哪里讨论过?

python
  • 1 个回答
  • 26 Views
上一页
下一页

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5