当我尝试使用gui运行无限循环时,为什么Python多进程崩溃

2024-04-19 02:27:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我从大学开始就没有编写过代码,而且我是Python的新手,所以我是作为一个相对新手来做这件事的。我的最终目标是有一个gui程序,它将根据人们进入twitch chat的命令做出反应。我有一个用tkinter创建的简单gui和一个监控twitch聊天的机器人。当我分别在它们自己的.py文件中运行这两个组件时,它们工作得很好。当它们在同一个程序中一起运行时,它会锁定,因为我有两个无限循环在运行。我试着穿线,但也没用。我尝试使用多进程,而不是线程,我已经包括了下面的代码。我已经看过其他的多进程和线程问题,但我似乎不明白这一点。在

from tkinter import *

# settings contains values for HOST, PORT, NICK, PASS, CHANNEL
from settings import * 

import socket
import multiprocessing

class Gui:
    def __init__(self, master):
        self.master=master
        master.title("AftA_Bot beta")
        self.doodle = Canvas(master, width=720, height=576, bg="white")
        self.doodle.pack()
        self.out = Button(master, text="Quit", command=master.quit)
        self.out.pack()

class createbot:
    def __init__(self, server, port, username, token, channel):
        self.s = socket.socket()
        self.s.connect((server, port))
        self.channel = channel
        self.s.send(bytes("PASS " + token + "\r\n", "UTF-8"))
        self.s.send(bytes("NICK " + username + "\r\n", "UTF-8"))
        self.s.send(bytes("JOIN #" + channel + " \r\n", "UTF-8"))

        print("Connected to host")

        #  Clear initial connection text
        while True:
            line = str(self.s.recv(1024))
            if "End of /NAMES list" in line:
                break
        print("Initial login text cleared.")

    def read_chat(self):
        #  Infinite Loop to monitor chat
        while True:
            for line in str(self.s.recv(1024)).split('\\r\\n'):
                parts = line.split(':')
                if len(parts) < 3:
                    continue

                message = parts[2][:len(parts[2])]
                usernamesplit = parts[1].split("!")
                username = usernamesplit[0]
                print(username + ": " + message)


    def send_message(self, msg):
        self.s.send(bytes("PRIVMSG #" + self.channel + " :" + msg + "\r\n", "UTF-8"))



bot = createbot(HOST, PORT, NICK, PASS, CHANNEL)
botthread = multiprocessing.Process(target=bot.read_chat)

root = Tk()
mainapp = Gui(root)
guithread = multiprocessing.Process(target=root.mainloop)

try:
    botthread.start()
except:
    print("Could not start bot thread")

try:
    guithread.start()
except:
    print("Could not start gui thread")

以上代码导致以下输出/错误:

^{pr2}$

Tags: 代码importselfmastersendbytesdefline