远程计算器控制(包含wxPython,socket,thread)(初级水平)

其实很简单,只因我是新手,所以浪费了些时间。

客户端代码:

#coding=utf8
#这个是主线程加子线程的
import wx
import math
from socket import *
import threading
class MainFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'Calculator', size=(220,400),
                          style=wx.DEFAULT_FRAME_STYLE ^ (wx.RESIZE_BORDER | wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX))
        panel = wx.Panel(self)
        gridSizer = wx.GridSizer(rows=4, cols=4, hgap=3, vgap=3)
        mainSizer = wx.BoxSizer(wx.VERTICAL)
        self.resultStr = ''

        #-----StatusBar--------------------------------
        self.statusBar = wx.StatusBar(self, -1)
        self.statusBar.SetStatusText('Welcome to use this Calculator!')

        #----StaticText-----------------------------------
        self.staticText = wx.StaticText(panel, -1, '')
        #----TextCtrl----------------------------
        self.textCtrl = wx.TextCtrl(panel, -1, '',style=wx.TE_MULTILINE|wx.TE_RICH2)
        font = wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD, underline=False)
        self.textCtrl.SetFont(font)
        #-------Buttons-------------------------------------------------
        self.buttonLabels = "7 8 9 + 4 5 6 - 1 2 3 * 0 . / =".split()
        self.buttons = []
        self.flag = [] #index of button
        btnLength = len(self.buttonLabels)
        for i in range(btnLength):
            self.buttons.append(wx.Button(panel, i, size=(50,50),label=("%s" % self.buttonLabels[i])))
            gridSizer.Add(self.buttons[i], 0, 0)
        mainSizer.Add(self.textCtrl, 1, wx.EXPAND)
        mainSizer.Add(self.staticText, 0.7, wx.EXPAND)
        mainSizer.Add(gridSizer, 4, wx.EXPAND)
        panel.SetSizerAndFit(mainSizer)

        self.Bind(wx.EVT_BUTTON, self.OnResult, self.buttons[-1])

        #a list of handlers
        self.funcList = [self.OnClick]*(btnLength-1)
      
        for i in range(btnLength-1):
            self.buttonBind(i)

    def setText(self, value):
        '''set the value of TextCtrl'''
        self.textCtrl.SetValue(value)
        
    def buttonBind(self, index):
        self.buttons[index].Bind(wx.EVT_LEFT_DOWN, self.funcList[index])
    
    def OnResult(self,event):
        t_Calc=threading.Thread(target=Conncal,args=(self,event))
        t_Calc.setDaemon(True)
        t_Calc.start()  
        
    def OnClick(self, event):
        self.resultStr += self.buttonLabels[event.GetId()]
        self.setText(self.resultStr)
        event.Skip()


def Conncal(FrameObject, event):
#         result="Error"
    result=FrameObject.resultStr
    try:
        HOST,PORT="127.0.0.1",56788
        s = socket(AF_INET, SOCK_STREAM)
        s.connect((HOST, PORT))
        s.send(result + '=')
        result=s.recv(1024)
        print result    #在客户端控制台输出
    except:
        pass
    FrameObject.resultStr=result
    FrameObject.setText(result)
    event.Skip() 
    
        
if __name__=='__main__':
    app = wx.PySimpleApp()
    frame = MainFrame(None, -1)
    frame.Show()
    app.MainLoop()

服务器端代码:

#coding=utf8
import SocketServer
class TelnetProtocolHandler(SocketServer.StreamRequestHandler):
    def setup(self):
        SocketServer.StreamRequestHandler.setup(self)
        #Something
    def handle(self):
        #if line != "" : 
        self.data = self.request.recv(1024).strip()
        t=self.data
        if t.endswith('='):
            t=t[:-1]
            self.request.send(str(eval(t)))#计算核心代码
            consoleshow=t+"="+str(eval(t))#服务器端控制台打印算式
            print consoleshow
        else:
            #Do somthing
            print t
    def finish(self):
        SocketServer.StreamRequestHandler.finish(self)
#         self.server.finishConnection(self)

socServer = SocketServer.ThreadingTCPServer(("127.0.0.1",56788), TelnetProtocolHandler)
socServer.serve_forever()


完。(原创作品,转载请注明出处)

WxPython是一个基于Python语言的GUI工具包,它允许开发者使用Python编写跨平台的桌面应用程序,包括像计算器这样的简单应用。在WxPython中创建一个计算器,你可以利用它的窗口、控件以及事件处理机制。以下是一个简单的步骤: 1. 导入所需的模块: ```python import wx ``` 2. 创建`CalculatorFrame`类,继承自`wx.Frame`: ```python class CalculatorFrame(wx.Frame): def __init__(self, parent): super().__init__(parent, title="简易计算器", size=(400, 300)) ``` 3. 添加面板和按钮,用于显示数字和运算符,并绑定事件处理函数: ```python self.textCtrl = wx.TextCtrl(self, value="", size=(350, -1), style=wx.TE_PROCESS_ENTER) buttons = [ ["7", "8", "9", "/",], ["4", "5", "6", "*",], ["1", "2", "3", "-",], ["0", ".", "=", "+"], ] for row in buttons: for button_text in row: btn = wx.Button(self, label=button_text) btn.Bind(wx.EVT_BUTTON, self.on_click, btn) def on_click(self, event): # 事件处理,添加点击按钮的操作... ``` 4. 实现计算功能: ```python def on_enter(self, event): text = self.textCtrl.GetValue() try: result = eval(text) # 使用eval计算表达式,注意这可能存在安全风险 self.textCtrl.ChangeValue(str(result)) except Exception as e: print(f"计算错误: {e}") def clear(self): self.textCtrl.Clear() # 主程序入口 if __name__ == "__main__": app = wx.App() frame = CalculatorFrame(None) frame.Show() app.MainLoop() ``` 这个例子展示了如何基本构建一个WxPython计算器,实际项目中需要考虑更多细节,比如错误处理、用户输入验证等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值