在Tkinter中使用Pyrogram与线程时出现错误

0 投票
1 回答
52 浏览
提问于 2025-04-14 16:28

错误代码:

在这里输入图片描述

我按下发送消息的按钮,一切正常;我按下停止按钮,还是正常的,但 app.stop 并没有停止,再次发送消息时就出现了错误。

代码:

from customtkinter import *
import customtkinter as ctk
from threading import Thread
import time, os, asyncio
from pyrogram import Client
from pyrogram.enums import MessageMediaType

run = True
path = os.getcwd()
app = Client(path + "\\users\\" + "user")
async def tg_bot():
    global run
    global app  # Reference the global app variable
    s = 0
    await app.start()
    async for ii in app.get_chat_history(-1002070231241):
        if ii.media == MessageMediaType.VIDEO:
            if run:
                s = s + 1
                await app.copy_message(-1002142940185, -1002070231241, ii.id, caption="")
                print(s, "sended.")
                await asyncio.sleep(1)

    await app.stop()

def start():
    global run
    run = True

    def don(dongu, _e):
        try:
            dongu.run_until_complete(tg_bot())
        finally:
            dongu.close()

    loop = asyncio.get_event_loop()
    event = asyncio.Event()
    oto = Thread(target=don, args=(loop, event))
    oto.daemon = True
    oto.start()

def stop():
    global run
    run = False
    global app
    app.stop

root = ctk.CTk()
root.geometry("300x300")
basla = CTkButton(root, text="message send", command=start)
basla.place(x=75, y=100)

dur = CTkButton(root, text="stop", command=stop)

dur.place(x=75, y=200)

root.mainloop()

视频:

https://drive.google.com/file/d/1tTuNKZ_WR9KK7WOjXbdzP3-M_TC4l6yk/view?usp=drive_link

1 个回答

0

我觉得你只是忘了在第46行的app.stop调用中加上括号。

app.stop

你只需要加上括号就行:

app.stop()

现在完整的代码是:

from customtkinter import *
import customtkinter as ctk
from threading import Thread
import time, os, asyncio
from pyrogram import Client
from pyrogram.enums import MessageMediaType

run = True
path = os.getcwd()
app = Client(path + "\\users\\" + "user")
async def tg_bot():
    global run
    global app  # Reference the global app variable
    s = 0
    await app.start()
    async for ii in app.get_chat_history(-1002070231241):
        if ii.media == MessageMediaType.VIDEO:
            if run:
                s = s + 1
                await app.copy_message(-1002142940185, -1002070231241, ii.id, caption="")
                print(s, "sended.")
                await asyncio.sleep(1)

    await app.stop()

def start():
    global run
    run = True

    def don(dongu, _e):
        try:
            dongu.run_until_complete(tg_bot())
        finally:
            dongu.close()

    loop = asyncio.get_event_loop()
    event = asyncio.Event()
    oto = Thread(target=don, args=(loop, event))
    oto.daemon = True
    oto.start()

def stop():
    global run
    run = False
    global app
    app.stop()

root = ctk.CTk()
root.geometry("300x300")
basla = CTkButton(root, text="message send", command=start)
basla.place(x=75, y=100)

dur = CTkButton(root, text="stop", command=stop)

dur.place(x=75, y=200)

root.mainloop()

希望我能帮到你,祝你有个愉快的一天!

撰写回答