gpt4 book ai didi

python - 在 wxpython 中使用套接字

转载 作者:可可西里 更新时间:2023-11-01 02:41:14 25 4
gpt4 key购买 nike

我有一个 TCP 服务器和一个 TCP 客户端。
我想制作下面代码的 GUI 版本,使用 .
我已经准备好 GUI 界面脚本,但是,我在合并这两个脚本时遇到了问题。

如何合并我的套接字脚本和我的 GUI?

我的套接字服务器

from socket import *
from time import ctime
import random

bufsiz = 1024
port = random.randint(1025,36000)
host = 'localhost'
addr = (host, port)
print 'Port:',port

tcpServer = socket(AF_INET , SOCK_STREAM)
tcpServer.bind(addr)
tcpServer.listen(5)
try:
while True:
print 'Waiting for connection..'
tcpClient, caddr = tcpServer.accept()
print 'Connected To',caddr

while True:
data = tcpClient.recv(bufsiz)
if not data:
break
tcpClient.send('[%s]\nData\n%s' % (ctime(),data))
print data
tcpClient.close()

except KeyboardInterrupt:
tcpServer.close()

raw_input('Enter to Quit')

我的 GUI 脚本(使用 wxglade 制作)

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# generated by wxGlade 0.6.5 (standalone edition) on Mon Feb 18 19:50:59 2013

import wx

# begin wxGlade: extracode
# end wxGlade


class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: MyFrame.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.chat_log = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE | wx.TE_READONLY)
self.text_send = wx.TextCtrl(self, -1, "")

self.__set_properties()
self.__do_layout()

self.Bind(wx.EVT_TEXT_ENTER, self.text_e, self.text_send)
# end wxGlade

def __set_properties(self):
# begin wxGlade: MyFrame.__set_properties
self.SetTitle("frame_1")
self.SetSize((653, 467))
self.chat_log.SetMinSize((635, 400))
self.text_send.SetMinSize((635, -1))
self.text_send.SetFocus()
# end wxGlade

def __do_layout(self):
# begin wxGlade: MyFrame.__do_layout
sizer_1 = wx.FlexGridSizer(1, 1, 1, 1)
sizer_1.Add(self.chat_log, 0, 0, 0)
sizer_1.Add(self.text_send, 0, wx.ALL, 1)
self.SetSizer(sizer_1)
self.Layout()
# end wxGlade

def text_e(self, event): # wxGlade: MyFrame.<event_handler>
text = self.text_send.GetValue()
self.chat_log.AppendText("\n"+text)
self.text_send.SetValue("")
event.Skip()

# end of class MyFrame

class MyMenuBar(wx.MenuBar):
def __init__(self, *args, **kwds):
# begin wxGlade: MyMenuBar.__init__
wx.MenuBar.__init__(self, *args, **kwds)
self.File = wx.Menu()
self.Append(self.File, "File")
self.View = wx.Menu()
self.Append(self.View, "View")

self.__set_properties()
self.__do_layout()
# end wxGlade

def __set_properties(self):
# begin wxGlade: MyMenuBar.__set_properties
pass
# end wxGlade

def __do_layout(self):
# begin wxGlade: MyMenuBar.__do_layout
pass
# end wxGlade

# end of class MyMenuBar
if __name__ == "__main__":
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame_1 = MyFrame(None, -1, "")
app.SetTopWindow(frame_1)
frame_1.Show()
app.MainLoop()

最佳答案

简而言之:将您的第一个脚本封装到一个函数中。将您的函数导入 wxPython 应用程序。从某个事件处理程序调用该函数。将您的功能响应反馈给 GUI。

但是,您需要重新设计您的软件,使其不包含无限循环。事件处理程序应该只运行很短的时间。另一种方法是在单独的线程中运行您的函数,通过 GUI 传达响应并添加从主 GUI 线程终止线程的能力。

沿着这些线的东西:

import wx
from socket import *
from time import ctime
import random
import threading

bufsiz = 1024
port = random.randint(1025,36000)
host = 'localhost'
addr = (host, port)

class MainWindow(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)

self.panel = wx.Panel(self)
self.text = wx.TextCtrl(self.panel, style=wx.TE_MULTILINE)

self.sizer = wx.BoxSizer()
self.sizer.Add(self.text, 1, wx.ALL | wx.EXPAND, 5)

self.panel.SetSizerAndFit(self.sizer)
self.Show()

self.thread = threading.Thread(target=self.Server)
self.thread.start()

def Print(self, text):
wx.CallAfter(self.text.AppendText, text + "\n")

def Server(self):
self.Print("Port: {}".format(port))

tcpServer = socket(AF_INET , SOCK_STREAM)
tcpServer.bind(addr)
tcpServer.listen(5)
try:
while True:
self.Print("Waiting for connection...")
tcpClient, caddr = tcpServer.accept()
self.Print("Connected To {}".format(caddr))

while True:
data = tcpClient.recv(bufsiz)
if not data:
break
tcpClient.send('[%s]\nData\n%s' % (ctime(), data))
self.Print(data)
tcpClient.close()

except KeyboardInterrupt:
tcpServer.close()

app = wx.App(False)
win = MainWindow(None)
app.MainLoop()

然而,这不会在退出时终止另一个线程。 tcpServer.accept() 是阻塞操作。你可能想看看这个 answer如何以非阻塞方式连接到套接字。然后你就可以使用一些共享标志轻松地终止你的线程。

关于python - 在 wxpython 中使用套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14955720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com