20234219 罗国淦 《Python程序设计》 实验2报告

20234219罗国淦 2024-03-31 13:43:45

20234219 2023-2024-2 《Python程序设计》实验2报告

课程:《Python程序设计》
班级:2342
姓名:罗国淦
学号:20234219
实验教师:王志强
实验日期:2024年3月30日
必修/选修: 公选课

1.实验内容

设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。

2. 实验过程及结果

1.翻书学习GUI;

img


2.设计计算器外观;
3.绑定事件;
4.写入计算代码;
5.使用并修BUG;

img

6.完善代码如下(但因为自己记错了,所以阶乘运算的数字放在“!”之后):

#pyinstaller -F -w code/caculator.py
import wx
list=[]
numberend=0

def ending():
    global numberend
    signped=0
    signpnow=0
    signpen=0
    mark1=None
    mark2=None
    o=1
    op=0
    for i in range(0,len(list)):
        a=list[i]
        if type(a)==int:
            a=int(a)
            signped=signpnow
            signpnow=a
            signpen*=10
            signpen+=signpnow
        else:
            signped=signpnow
            signpnow=a
            if mark1 == "!":
                #print("@", signpen)
                for i in range(2, signpen + 1):
                    #print(o)
                    o *= i
                op=1
                signpen=0
            if signpnow == "=":
                if mark1 == "+":
                    if op==0:
                        numberend+=signpen
                    else:
                        numberend+=o
                        o=1
                        op=0
                if mark1 == "-":
                    if op==0:
                        numberend-=signpen
                    else:
                        numberend-=o
                        o = 1
                        op = 0
                if mark1 == "×":
                    if op == 0:
                        numberend *= signpen
                    else:
                        numberend *= o
                        o = 1
                        op = 0
                if mark1=="÷":
                    if op == 0:
                        numberend /= signpen
                    else:
                        numberend /= o
                        o = 1
                        op = 0
                if op==1:
                    numberend+=o
                    o=1
                    op=0
            else:
                if numberend==0 and mark2!="!":
                    numberend=signpen
                    signpen=0
                if mark1 == "+":
                    if op==0:numberend+=signpen
                    else:
                        numberend+=o
                        o=1
                        op=0
                    signpen=0
                if mark1=="-":
                    if op == 0:
                        numberend -= signpen
                    else:
                        numberend -= o
                        o = 1
                        op = 0
                    signpen = 0
                if mark1 == "×":
                    if op == 0:
                        numberend *= signpen
                    else:
                        numberend *= o
                        o = 1
                        op = 0
                    signpen = 0
                if mark1 == "÷":
                    if op == 0:
                        numberend /= signpen
                    else:
                        numberend /= o
                        o = 1
                        op = 0
                    signpen=0
                if op==1:
                    numberend+=o
                    o=1
                    op=0
                mark1=signpnow
        #print(signped, signpnow, signpen, mark1, numberend, op, o)

class Caculator(wx.Frame):
    global list
    global numberend
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,"计算器",size=(500,700))

        font1=wx.Font(30,wx.DEFAULT,wx.FONTSTYLE_NORMAL,wx.NORMAL)
        font2=wx.Font(16, wx.DEFAULT, wx.FONTSTYLE_NORMAL, wx.NORMAL)

        panel=wx.Panel(self)

        self.printframe=wx.TextCtrl(panel,size=(300,80),style=wx.TE_READONLY|wx.TE_RIGHT|wx.HSCROLL)

        self.number1=wx.Button(panel,label="1",size=(80,100))
        self.number2=wx.Button(panel,label="2",size=(80,100))
        self.number3=wx.Button(panel,label="3",size=(80,100))
        self.number4=wx.Button(panel,label="4",size=(80,100))
        self.number5=wx.Button(panel,label="5",size=(80,100))
        self.number6=wx.Button(panel,label="6",size=(80,100))
        self.number7=wx.Button(panel,label="7",size=(80,100))
        self.number8=wx.Button(panel,label="8",size=(80,100))
        self.number9=wx.Button(panel,label="9",size=(80,100))
        self.number0=wx.Button(panel,label="0",size=(80,100))

        self.sign1=wx.Button(panel,label="+",size=(80,100))
        self.sign2=wx.Button(panel,label="-",size=(80,100))
        self.sign3=wx.Button(panel,label="×",size=(80,100))
        self.sign4=wx.Button(panel,label="÷",size=(80,100))
        self.sign5=wx.Button(panel,label="=",size=(80,100))
        self.sign6=wx.Button(panel,label="!",size=(80,100))
        self.sign7=wx.Button(panel,label="<——\n"+"退格",size=(80,100))
        self.sign8=wx.Button(panel,label="归零",size=(80,100))

        self.printframe.SetFont(font2)
        self.number1.SetFont(font1)
        self.number2.SetFont(font1)
        self.number3.SetFont(font1)
        self.number4.SetFont(font1)
        self.number5.SetFont(font1)
        self.number6.SetFont(font1)
        self.number7.SetFont(font1)
        self.number8.SetFont(font1)
        self.number9.SetFont(font1)
        self.number0.SetFont(font1)
        self.sign1.SetFont(font1)
        self.sign2.SetFont(font1)
        self.sign3.SetFont(font1)
        self.sign4.SetFont(font1)
        self.sign5.SetFont(font1)
        self.sign6.SetFont(font1)

        self.number1.SetBackgroundColour("#90EE90")
        self.number2.SetBackgroundColour("#90EE90")
        self.number3.SetBackgroundColour("#90EE90")
        self.number4.SetBackgroundColour("#90EE90")
        self.number5.SetBackgroundColour("#90EE90")
        self.number6.SetBackgroundColour("#90EE90")
        self.number7.SetBackgroundColour("#90EE90")
        self.number8.SetBackgroundColour("#90EE90")
        self.number9.SetBackgroundColour("#90EE90")
        self.number0.SetBackgroundColour("#90EE90")
        self.sign1.SetBackgroundColour("#87CEEB")
        self.sign2.SetBackgroundColour("#87CEEB")
        self.sign3.SetBackgroundColour("#87CEEB")
        self.sign4.SetBackgroundColour("#87CEEB")
        self.sign5.SetBackgroundColour("#87CEEB")
        self.sign6.SetBackgroundColour("#87CEEB")
        self.sign7.SetBackgroundColour("#FF6100")
        self.sign8.SetBackgroundColour("#FF6100")

        self.number1.Bind(wx.EVT_BUTTON,self.Number1)
        self.number2.Bind(wx.EVT_BUTTON,self.Number2)
        self.number3.Bind(wx.EVT_BUTTON,self.Number3)
        self.number4.Bind(wx.EVT_BUTTON, self.Number4)
        self.number5.Bind(wx.EVT_BUTTON, self.Number5)
        self.number6.Bind(wx.EVT_BUTTON, self.Number6)
        self.number7.Bind(wx.EVT_BUTTON, self.Number7)
        self.number8.Bind(wx.EVT_BUTTON, self.Number8)
        self.number9.Bind(wx.EVT_BUTTON, self.Number9)
        self.number0.Bind(wx.EVT_BUTTON, self.Number0)
        self.sign1.Bind(wx.EVT_BUTTON, self.Sign1)
        self.sign2.Bind(wx.EVT_BUTTON, self.Sign2)
        self.sign3.Bind(wx.EVT_BUTTON, self.Sign3)
        self.sign4.Bind(wx.EVT_BUTTON, self.Sign4)
        self.sign5.Bind(wx.EVT_BUTTON, self.Sign5)
        self.sign6.Bind(wx.EVT_BUTTON, self.Sign6)
        self.sign7.Bind(wx.EVT_BUTTON,self.Sign7)
        self.sign8.Bind(wx.EVT_BUTTON, self.Sign8)

        rowh0=wx.BoxSizer(wx.HORIZONTAL)
        rowh0.Add(self.printframe,proportion=0,flag=wx.ALL,border=1)

        rowh1=wx.BoxSizer(wx.HORIZONTAL)
        rowh1.Add(self.number1,proportion=0,flag=wx.ALL,border=5)
        rowh1.Add(self.number2,proportion=0,flag=wx.ALL,border=5)
        rowh1.Add(self.number3, proportion=0, flag=wx.ALL, border=5)
        rowh1.Add(self.sign1,proportion=0,flag=wx.ALL,border=5)
        rowh1.Add(self.sign7,proportion=0,flag=wx.ALL,border=5)

        rowh2 = wx.BoxSizer(wx.HORIZONTAL)
        rowh2.Add(self.number4, proportion=0, flag=wx.ALL, border=5)
        rowh2.Add(self.number5, proportion=0, flag=wx.ALL, border=5)
        rowh2.Add(self.number6, proportion=0, flag=wx.ALL, border=5)
        rowh2.Add(self.sign2, proportion=0, flag=wx.ALL, border=5)
        rowh2.Add(self.sign8,proportion=0, flag=wx.ALL,border=5)

        rowh3 = wx.BoxSizer(wx.HORIZONTAL)
        rowh3.Add(self.number7, proportion=0, flag=wx.ALL, border=5)
        rowh3.Add(self.number8, proportion=0, flag=wx.ALL, border=5)
        rowh3.Add(self.number9, proportion=0, flag=wx.ALL, border=5)
        rowh3.Add(self.sign3, proportion=0, flag=wx.ALL, border=5)

        rowh4 = wx.BoxSizer(wx.HORIZONTAL)
        rowh4.Add(self.sign6, proportion=0, flag=wx.ALL, border=5)
        rowh4.Add(self.number0, proportion=0, flag=wx.ALL, border=5)
        rowh4.Add(self.sign5, proportion=0, flag=wx.ALL, border=5)
        rowh4.Add(self.sign4, proportion=0, flag=wx.ALL, border=5)

        rowl=wx.BoxSizer(wx.VERTICAL)
        rowl.Add(rowh0,proportion=0,flag=wx.BOTTOM|wx.TOP|wx.ALIGN_CENTER,border=45)
        rowl.Add(rowh1,proportion=0,flag=wx.EXPAND|wx.LEFT|wx.RIGHT,border=5)
        rowl.Add(rowh2, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=5)
        rowl.Add(rowh3, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=5)
        rowl.Add(rowh4, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=5)

        panel.SetSizer(rowl)

    def Number1(self,event):
        list.append(1)
        #print(list)
        self.printframe.AppendText("1")
    def Number2(self,event):
        list.append(2)
        self.printframe.AppendText("2")
    def Number3(self,event):
        list.append(3)
        self.printframe.AppendText("3")
    def Number4(self,event):
        list.append(4)
        self.printframe.AppendText("4")
    def Number5(self,event):
        list.append(5)
        self.printframe.AppendText("5")
    def Number6(self,event):
        list.append(6)
        self.printframe.AppendText("6")
    def Number7(self,event):
        list.append(7)
        self.printframe.AppendText("7")
    def Number8(self,event):
        list.append(8)
        self.printframe.AppendText("8")
    def Number9(self,event):
        list.append(9)
        self.printframe.AppendText("9")
    def Number0(self,event):
        list.append(0)
        self.printframe.AppendText("0")
    def Sign1(self,event):
        list.append("+")
        self.printframe.AppendText("+")
    def Sign2(self,event):
        list.append("-")
        self.printframe.AppendText("-")
    def Sign3(self,event):
        list.append("×")
        self.printframe.AppendText("×")
    def Sign4(self,event):
        list.append("÷")
        self.printframe.AppendText("÷")
    def Sign5(self,event):
        list.append("=")
        self.printframe.AppendText("=")
        ending()
        #while numberend!=0:
            #listend.append=numberend%10
            #numberend//=10
        self.printframe.AppendText(str(numberend))
        while list!=[]:
            list.pop()
    def Sign6(self,event):
        list.append("!")
        self.printframe.AppendText("!")
    def Sign7(self,event):
        list.pop()
        l=self.printframe.GetLineLength(0)
        self.printframe.Remove(l-1, l)
        #print(l)
    def Sign8(self,event):
        global numberend
        self.printframe.Clear()
        while list != []:
            list.pop()
        #print(list)
        numberend=0

if __name__ == "__main__":
    app=wx.App()
    caculator=Caculator(parent=None,id=-1)
    caculator.Show()
    app.MainLoop()

3. 实验过程中遇到的问题和解决过程

  • 问题1:不会GUI
  • 问题1解决方案:翻书自学
  • 问题2:不会设置按钮颜色
  • 问题2解决方案:查阅相关网站
  • 问题3:BUG太多
  • 问题2解决方案:在其中插入多个print(),根据输出情况判断BUG位置

其他(感悟、思考等)

  为了编这个计算器,我特意花了一个多小时自学了GUI,然后再不断尝试编写计算器程序。中间遇到很多次报错而不清楚是什么原因,我就尝试把一条条代码注释掉或进行修改,看问题出在哪里。这样弄了一个上午才终于变成了。成就感满满,这就是自己先付出,后收获的甜蜜蜜。

参考资料

...全文
86 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

93

社区成员

发帖
与我相关
我的任务
社区描述
Python程序设计作业
软件构建 高校 北京·丰台区
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧