Python中的GUI : wxPython

  • wxPython是Python语言的一套优秀的GUI图形库。
  • Python程序员可以很方便的创建完整的、功能键全的GUI用户界面。
  • wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户的。

帮同学做一个抽题小软件,功能简单,两个文本框,两个按钮,txt里按行写入题目和答案。正在学python就打算学一下,用python做了。
界面如下图所示。
这里写图片描述

环境:win10 64位 ,python2.7.12 64位
总共三个py文件+一个txt。


代码如下

load_problem.py

#coding:utf-8
#load_problem.py
#author:PlusTang

def load_problem():
    filepath = './problem.txt'
    with open(filepath, 'r') as f:
        problem =[]
        answer = []
        txt = f.readlines()
        i = 1
        for i in range(len(txt)):
            if i%2 == 0:
                problem.append(txt[i].strip())
            else:
                answer.append(txt[i].strip())
    return problem, answer

method.py

#coding:utf-8
#method.py
#author:PlusTang

from load_problem import load_problem
import random

global a
a = 0

problem, answer = load_problem()
problem_num = len(problem)
answer_num = len(answer)
# print problem_num
if problem_num != answer_num:
    print 'load data error!'

order = random.sample(range(problem_num), problem_num)
# print order

def get_problem():
    global a
    a = a + 1
    if a > problem_num:
         a = 0
    return problem[order[a-1]]

def get_answer():
    global a
    return answer[order[a-1]]

myUI1.py

# coding:UTF-8
#myUI1.py
#author:PlusTang

import wx
from method import get_problem, get_answer,a, problem_num

class MultiTextFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, u"抽题系统",
                          size=(600, 600))
        panel = wx.Panel(self, -1)
        # panel.SetBackgroundColour('#4f5049')
        # font = wx.SystemSettings_GetFont(wx.SYS_SYSTEM_FONT)
        font = wx.Font(12, wx.ROMAN, wx.NORMAL, wx.BOLD, False)
        font.SetPointSize(16)

        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add((-1, 15))
        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        st1 = wx.StaticText(panel, label=u'题目')
        st1.SetFont(font)

        hbox1.Add(st1, flag=wx.RIGHT, border=10)
        self.tc = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_RICH2 | wx.TE_READONLY)
        self.tc.SetFont(font)
        hbox1.Add(self.tc, proportion=1, flag=wx.EXPAND)
        vbox.Add(hbox1, proportion=2, flag=wx.LEFT | wx.RIGHT | wx.EXPAND, border=10)

        vbox.Add((-1, 15))

        hbox3 = wx.BoxSizer(wx.HORIZONTAL)
        st2 = wx.StaticText(panel, label=u'答案')
        st2.SetFont(font)
        hbox3.Add(st2,flag=wx.RIGHT, border=10)
        self.tc2 = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_RICH2 | wx.TE_READONLY)
        self.tc2.SetFont(font)
        hbox3.Add(self.tc2, proportion=1, flag=wx.EXPAND)
        vbox.Add(hbox3, proportion=1, flag=wx.LEFT | wx.RIGHT | wx.EXPAND,border=10)

        vbox.Add((-1, 20))

        hbox5 = wx.BoxSizer(wx.HORIZONTAL)
        btn1 = wx.Button(panel, label=u'随机抽题', size=(110, 50))
        btn1.SetFont(font)
        hbox5.Add(btn1)
        btn2 = wx.Button(panel, label=u'显示答案', size=(110, 50))
        btn2.SetFont(font)
        hbox5.Add(btn2, flag=wx.LEFT | wx.BOTTOM, border=50)
        vbox.Add(hbox5, flag=wx.ALIGN_CENTER_HORIZONTAL  | wx.RIGHT, border=10)

        panel.SetSizer(vbox)

        self.Bind(wx.EVT_BUTTON, self.getProblem, btn1)
        self.Bind(wx.EVT_BUTTON, self.getAnswer, btn2)
        self.b = 0

    def getProblem(self, event):
        self.b = self.b+1
        if self.b > problem_num:
            self.Close()
        self.tc.Clear()
        self.tc2.Clear()
        self.tc.AppendText(get_problem())


    def getAnswer(self, event):
        self.tc2.Clear()
        self.tc2.AppendText(get_answer())


class MyApp(wx.App):
    def __init__(self):
        # 重构__init__方法,将错误信息重定位到文件中;
        # 默认redirect=True,输出到StdOut或StdError;
        # 为防止程序因错误一闪而过无法捕捉信息,可在
        # 控制台中使用python -i example.py来运行程序。
        wx.App.__init__(self, redirect=False, filename=r"./IO.txt")

    def OnInit(self):
        frame = MultiTextFrame()
        frame.Show(True)
        return True


def main():
    app = MyApp()
    app.MainLoop()


if __name__ == "__main__":
    main()

problem.txt

1.我是题目
1.我是答案
2.我是题目
2.我是答案
3.…………

做UI时的按钮响应一开始遇到了一点问题。在定义的响应函数中无法调用MultiTextFrame类中def init(self)初始化函数里定义的文本框。
后来发现,定义文本框时前面加上self.就行了。
也就是把

#文本框
tc2 = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_RICH2 | wx.TE_READONLY)

改为

#文本框
self.tc2 = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_RICH2 | wx.TE_READONLY)

对应的响应函数里调用文本框时,前面加上self.就行了:

#响应函数
    def getAnswer(self, event):
        self.tc2.Clear()
        self.tc2.AppendText(get_answer())

AttributeError: ‘module’ object has no attribute ‘Frame’ 解决方法
参考这里
主要就是这三个问题:

  1. 自己根本就没有安装wxpython,或者自己安装不正确,出现问题;自己import下wx测试即可;
  2. 自己命名的文件与python自带的模块文件名重名,这种情况只需将自己的文件改名即可。
  3. 如果以上都没有问题,还是出现一些异常报错,那就说明你可能安装了不止一个版本的wxpython,或者某个版本不准确;

果然,经过排查,是文件名称重名了。我把python文件的名字改了,错误就消失了。


关于wxpython基本控件的学习,可以参考这里,写的比较详细。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值