`
hanyh
  • 浏览: 235421 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

python wxpython一例

阅读更多
前些天wxpython做得简单代码,目标是:
比如说c:\photos\....下面有很多头像图片,这些图片在上面或下面有一个圆点,呈现图片一段时间,判断圆点在上面还是下面,按1,2进行反应,记录反应时间。
注:是帮朋友进行孤独症儿童注意力分配实验写的,后面因为在处理*.gif图片的时候响应速度不够好,改为用delphi7写了。

程序涉及:
wxpython
事件响应
图片缩放和GIF动画操作

# -*- coding: cp936 -*-
import time
import wx,os
import wx.animate

from operator import or_
from func import *
from  threading import *


class M(object):
    idx = 0
    total = 0
    right = 0
    wrong = 0
    starticker = 0 #开始时间
    steps = []
    answer = 0
    pause = 1000
    pre = 'bmp' #0 is bmp,1 is if,2 is text

 
        
class FullScreenPanel(wx.Panel):

    def __init__(self,parent):
        wx.Panel.__init__(self,parent,name="FullScreenPanel",style= wx.DEFAULT_FRAME_STYLE | wx.WANTS_CHARS )
        self.SetBackgroundColour('black')
        

    
        self.TrialBtn = wx.Button(self,label="练习")
        self.TrialBtn.Bind(wx.EVT_BUTTON,self.BeginTrial)
        self.TestBtn = wx.Button(self,label="测试")
        self.TestBtn.Bind(wx.EVT_BUTTON,self.BeginTest)

        sizer = wx.BoxSizer(orient=wx.VERTICAL)  
        sizer.AddStretchSpacer()
        sizer.Add(self.TrialBtn,0, wx.ALIGN_CENTER )
        sizer.Add(self.TestBtn,0, wx.ALIGN_CENTER )
        sizer.AddStretchSpacer() 
        self.SetSizer(sizer)
        

        self.Layout()
        


    
    def hideImg(self):
        try:
            self.curImg.Show(False)
        except:
            pass
    def hideGif(self):
        try:
            self.curGif.Stop()
            self.curGif.Close()
            self.curGif.Show(False)
        except:
            print "hide gif error"
            pass
    def hideText(self):
        try:
            self.curText.Show(False)
        except:
            pass
            
    
    def KeyDownResponse(self,evt):        
        code = evt.GetKeyCode()
        if code in (49,50):
            self.stopTimer()
            self.Bind(wx.EVT_KEY_DOWN,self.KeyDownNull)
            if code == 49:
                code = 1
            else:
                code = 2
            if code == M.answer:
                slapedTime = time.time() - M.starticker 

                self.show(response['right'])
                M.right = M.right + 1
                M.total = M.total + 1
                rate = M.right/float(M.total)
            else:
                slapedTime = time.time() - M.starticker 
                self.show(response['wrong'])
                M.wrong = M.wrong + 1
                M.total = M.total + 1
                rate = M.right/float(M.total)

            text = "正确率:%.3f 耗时:%.3f" % (rate,slapedTime)
            if self.practice:
                self.addText(text)
            self.fp.write(text+"\n") 
            self.timer = wx.CallLater(M.pause,self.next)
          
        else:
            pass
        
    def addText(self,text):
        mm=wx.DisplaySize()
        x0 = 100
        y0 = 600
        self.curText = wx.StaticText(self,-1,text,(x0,y0),(160,0),wx.ALIGN_CENTER)
        font=wx.Font(18,wx.DECORATIVE,wx.NORMAL,wx.NORMAL)        
        self.curText.SetFont(font)
        self.curText.SetForegroundColour("white")
        self.curText.SetBackgroundColour("black")
        self.curText.Show(True)
                
    def KeyDownNull(self,evt):
        pass        
            
    def showText(self,text):
        mm=wx.DisplaySize()


        x0 = (mm[0] - 60) / 2
        y0 = (mm[1] - 60) / 2
        self.curText = wx.StaticText(self,-1,text,(x0,y0),(160,0),wx.ALIGN_CENTER)
        font=wx.Font(28,wx.DECORATIVE,wx.NORMAL,wx.NORMAL)        
        self.curText.SetFont(font)
        self.curText.SetForegroundColour("white")
        self.curText.SetBackgroundColour("black")
        self.curText.Show(True)
                
    def showBmp(self,fpath):
        try:
            self.curImg.Show(False)
        except:
            pass
        mm=wx.DisplaySize()
        img = wx.Image(fpath, wx.BITMAP_TYPE_BMP)
        x0 = (mm[0] - img.GetWidth()) / 2
        y0 = (mm[1] - img.GetHeight()) / 2
        wxBitmap = img.ConvertToBitmap()
       # self.curImg.SetBitmap(wxBitmap)
        self.curImg = wx.StaticBitmap(self, -1, img.ConvertToBitmap(), (x0,y0), (img.GetWidth(), img.GetHeight()))
        self.curImg.Show(True)
        print "end.."+fpath

    def showGif(self,fpath):
        mm=wx.DisplaySize()
        
        img = wx.Image(fpath, wx.BITMAP_TYPE_GIF)
        x0 = (mm[0] - img.GetWidth()) / 2
        y0 = (mm[1] - img.GetHeight()) / 2
        self.curGif = wx.animate.GIFAnimationCtrl(self, -1, fpath, (x0,y0), (img.GetWidth(), img.GetHeight()))            
        self.curGif.GetPlayer().UseBackgroundColour(True)
        self.curGif.Play()
        
    def show(self,fpath): 
        type = getType(fpath)
        self.hideText()
        self.hideGif()
        if not type == M.pre:
            if type == "gif":
                self.hideText()
                self.hideImg()
                self.hideGif()

            elif type == "bmp":
                self.hideGif()
                self.hideText()
            else:
                self.hideImg()
                self.hideGif()
            M.pre = type
                
        print 'show '+fpath
        if  type == "bmp":
            self.hideText()
            self.showBmp(fpath)
        elif type == "gif":
            self.hideText()
            self.showGif(fpath)
        elif type == "":
            self.showText(fpath)
    
    def stopTimer(self):
        self.timer.Stop()  
              
    def timeout(self):
        self.stopTimer()
        self.Bind(wx.EVT_KEY_DOWN,self.KeyDownNull)
        self.show(response['timeout'])     
        M.total += 1
        rate = M.right / float(M.total)
        slapedTime = time.time() - M.starticker 
        
        text = "正确率:%.3f %.3f" % (rate,slapedTime)
        if self.practice:
            self.addText(text)   
            
        self.fp.write(text+"\n") 
        self.timer = wx.CallLater(M.pause,self.next)
    

            
    def next(self):
        idx = M.idx
        if idx > len(M.steps)-1:
            self.stopTimer()
            print "over"
            return ""
        print 'current idx %s' %idx
        opType =  M.steps[idx][0]
        fpath = M.steps[idx][1]
        type = getType(fpath)
        sepTime = M.steps[idx][2]
        M.idx = idx+1

        self.show(fpath)
        if opType == 0: #退出
            self.Bind(wx.EVT_KEY_DOWN,self.KeyDownOver)
        if opType == 1: #等待space
            self.Bind(wx.EVT_KEY_DOWN,self.KeyDownTrigger)
        elif opType in (2,3): #空操作
            self.Bind(wx.EVT_KEY_DOWN,self.KeyDownNull)
            self.timer = wx.CallLater(sepTime, self.next)    
        elif opType == 4:  #等待反映,1500ms 后
            self.Bind(wx.EVT_KEY_DOWN,self.KeyDownResponse) #多做一次也无所谓,让逻辑
            M.starticker = time.time()
            self.timer = wx.CallLater(sepTime, self.timeout)    
        elif opType == 9:
            M.answer = M.steps[idx][3]
            self.Bind(wx.EVT_KEY_DOWN,self.KeyDownResponse)
            self.timer = wx.CallLater(sepTime, self.next)    

        

    def KeyDownOver(self,evt):
        self.stopTimer()
        self.hideGif()
        self.hideText()
        self.hideImg()
        self.TrialBtn.Show()
        self.TestBtn.Show() 
        try:
            self.fp.close()
        except:
            pass
        M.steps = []
        M.idx = 0
        M.total = 0
        M.right = 0
        M.wrong = 0
        M.starticker = 0 #开始时间
        M.steps = []
        M.answer = 0
        
    def KeyDownTrigger(self,evt):
        if evt.GetKeyCode() == 32:
            self.next()
        
    def getSavePath(self):
        sp = time.strftime("%Y-%m-%d-%H-%M-%S",time.localtime())+".txt"
        return os.path.join(os.getcwd(),sp)
            
    def BeginTest(self,evt):
        fpath = self.getSavePath()
        self.fp = open(fpath, 'w') 
        
        self.practice = False
        self.TrialBtn.Hide()
        self.TestBtn.Hide() 
        M.steps = getSteps(testConf) 
        print M.steps
        self.next()
        self.FullScreen(evt) 

            
    def BeginTrial(self,evt):
        fpath = self.getSavePath()
        self.fp = open(fpath, 'w') 
        self.practice = True
        self.TrialBtn.Hide()
        self.TestBtn.Hide() 
        M.steps = getSteps(trialConf) 
        self.next()
        self.FullScreen(evt)
        
    def GetFlags(self):
        res = []
        val = "FULLSCREEN_ALL"
        res.append(getattr(wx,val))
        return reduce(or_,res,0)

    def FullScreen(self,evt):
        top = self.GetTopLevelParent()
        top.OnFullScreen(evt)

class MainFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, wx.ID_ANY, 'Test FullScreen', size=(600, 400))
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
        self.client = FullScreenPanel(self)

        mbar = wx.MenuBar()
        the_menu = wx.Menu()
        fullscreenMI = the_menu.Append(wx.ID_ANY,"Full Screen\tF12","Toggles Full Screen Mode")
        mbar.Append(the_menu,"File")
        self.SetMenuBar(mbar)
        self.Bind(wx.EVT_MENU,self.OnFullScreen,id=fullscreenMI.GetId())


    def OnCloseWindow(self, event):
        self.Destroy()

    def OnFullScreen(self,event):
        flags = self.client.GetFlags()
        self.ShowFullScreen(not self.IsFullScreen(),flags)

class MainApp(wx.App):
    def OnInit(self):
        self.main = MainFrame(None)
        self.main.Show()
        self.SetTopWindow(self.main)
        return True


def main():
    application = MainApp(redirect=False)
    application.MainLoop()

if __name__=='__main__':
    main()


# -*- coding: cp936 -*-
import os
import random
import wx

def opj(path):
    st = apply(os.path.join, tuple(path.split('/')))
    if path.startswith('/'):
        st = '/' + st
    return st


imgTypeDict = {
    'bmp':wx.BITMAP_TYPE_BMP,
    'gif':wx.BITMAP_TYPE_GIF,
    'png':wx.BITMAP_TYPE_PNG,
    'jpg':wx.BITMAP_TYPE_JPEG
}

#获取后缀
def getType(o):
    if o.rfind(".") > -1:
        idx=o.rindex(".")+1
        return o[idx:].lower() 
    else:
        return ""
    
    
p1 = opj('photos/right.bmp')
p2 = opj('photos/wrong.bmp')
p3 = opj('photos/no response.bmp')
response = {
    'right':p1,
    'wrong':p2,
    'timeout':p3
}
    
sep = (2,'+',1000)
sep0 = (2,'',1000)
trialConf = (
    (1,'photos/welcome.bmp'),      
    (1,'photos/instruction.bmp'), 
    (2,'+',1), #1000ms 文本
    (3,'photos/practice/face1', 400,200,1500),
 #探测的文件目录时间(面空时间,探测点时间,等待回答时间)
    (0,'photos/goodbye.bmp',5000)
)
testConf = (
    (1,'photos/welcome.bmp'),      
    (1,'photos/instruction.bmp'), 
    (2,'+',1000), #1000ms 文本
    (3,'photos/donghua', 400,50,1500),
 #探测的文件目录时间(面空时间,探测点时间,等待回答时间)
    (0,'photos/goodbye.bmp',5000)
)

def getSteps(conf):
    steps=[]
    for x in conf:
        type = x[0]
        img = x[1]
        if type == 0: #end
            item = (0,opj(x[1]),-1)
            steps.append(item)
            
        if type == 1: #单个图片
            item = (1,opj(x[1]),-1) #-1 means infinate
            steps.append(item)
        elif type == 2: #
            item = (2,x[1],x[2]) #内容,时间
            steps.append(item)
        elif type == 3:
            dir1 = x[1]   
            t1 = x[2]
            t2 = x[3]
            t3 = x[4]         
            face=[]
            probe=[]
            for root, dirs, files in os.walk(dir1, topdown=False):
                for name in files:
                    if name.endswith(".gif") or name.endswith(".bmp"):
                        face.append(opj(os.path.join(root, name)))
            face.sort()
            print face
            count = len(face)
            i=0
            while(i<count):
                curImg = face[i]
                i += 1
                nextImg = face[i]
                if nextImg.find("_2") > 0:   #存在2,就是下面有点
                    answer = 2
                else:
                    answer = 1
                i += 1
                curItem = (curImg,nextImg,answer)
                probe.append(curItem)
           # print face
            random.shuffle(probe)
            
            i=0
            count = len(probe)
          #  print probe
            while(i<count):
                curItem = probe[i]
                item = (3,curItem[0],t1)
                steps.append(item)
                item = (9,curItem[1],t2,curItem[2]) 
                #马上要激活keyboard反应,并置相应的时间处理函数 
                
                #(类型4需要响应,图片路径,呈现时间,正确答案,超时时间,
                steps.append(item)
                item = (4,curItem[0],t3)
                steps.append(item)
                steps.append(sep0)

                steps.append(sep)
                i += 1
            
    return steps
分享到:
评论

相关推荐

    Python 的WxPython库开源扫雷游戏

    本例移植自开源例程JMine 请在程序所在目录使用python PyMine.py启动例程需要先安装Python 3.11和wxPython 4.2Python WxPython开源扫雷游戏PyMine新版1.5迁徙到Python 3.11和wxPython 4.2。并将所有图像放大一倍,以...

    Python wxpython模块响应鼠标拖动事件操作示例

    wxPython是Python的一种扩展,是一个开源的GUI(图形用户界面)库,它为Python提供了一系列的图形控件和框架,让开发人员能够创建优雅且功能丰富的桌面应用程序。当涉及到处理用户交互,特别是鼠标事件时,wxPython...

    wxPython_i18n.7z

    这个压缩包包含了一系列的文件,用于演示如何利用Python内置的gettext模块为wxPython应用程序添加多语言支持。 【描述】在Python中,wxPython是一个流行的图形用户界面(GUI)工具包,它使得开发者能够创建原生外观...

    Python 35例实例脚本项目.zip

    Python 35例实例脚本项目是一套丰富的学习资源,旨在帮助初学者和有经验的开发者深入理解Python编程语言的应用。这些脚本涵盖了各种实际场景,包括数据处理、网络编程、文件操作、图形用户界面(GUI)开发以及自动化...

    python实例61-Python制作图形用户界面(GUI)让操作可视化.rar

    Python是一种强大的编程语言,广泛应用在各种领域,包括网络爬虫、数据分析、机器学习以及我们今天要讨论的主题——图形用户界面(GUI)开发。GUI能让复杂的程序操作变得直观易用,通过按钮、菜单、对话框等可视化...

    tableWidget_python_

    首先,`tableWidget`在Python中通常通过`PyQt`或`wxPython`等库实现。这里我们以`PyQt5`为例,其中的`QTableWidget`是`QWidget`的一个子类,用于创建可交互的表格。`QTableWidget`提供了添加、删除行和列,以及编辑...

    Python 串口工具(源码+.exe文件)

    在本例中,开发者使用了Python的图形用户界面(GUI)库,可能包括PyQt或wxPython等,这些库允许开发者创建美观且功能丰富的交互式界面。QT Designer是一个用于创建GUI界面的工具,它可以拖放控件,设计布局,生成.ui...

    Python项目开发实战_PetStore宠物商店_编程案例解析实例详解课程教程.pdf

    wxPython是Python中的一个GUI库,用于创建桌面应用程序。在PetStore项目中,开发者可以利用wxPython设计并实现用户友好的图形界面,比如登录窗口、商品展示面板、购物车视图、订单管理界面等,提供用户交互功能。 ...

    python桌面僵尸宠物

    标题“Python桌面僵尸宠物”揭示了这是一个使用Python编程语言创建的桌面应用,其特色在于具有一个僵尸主题的互动元素。这个应用可能是一个小游戏或者桌面玩具,用户可以通过右键操作来切换僵尸的不同形态,增加了...

    简单python抽奖界面

    通过以上知识点的学习和实践,你不仅可以掌握wxPython库的使用,还能理解如何创建一个完整的、具有实际功能的GUI应用,如本例中的“简单python抽奖界面”。在实践中不断优化和改进,你将能够设计出更加复杂的用户...

    python实现简易版计算器

    wxPython是Python的一个GUI(图形用户界面)开发库,基于wxWidgets C++库。wxPython提供了一种简单的方式来创建具有图形用户界面的应用程序。在本示例中,wxPython被用作构建简易计算器界面的工具。通过使用wxGlade...

    使_用python开发windows应用程序参考.pdf

    2. **wxPython**: wxPython是Python中用于构建GUI(图形用户界面)的应用程序的一个库,它是基于C++的wxWidgets库。它提供了许多预定义的组件,如按钮、文本框等,使得开发者能够快速创建具有原生外观的Windows应用...

    Python学习笔记4.docx

    在Python中,导入wxPython库并创建一个`wx.App`实例作为程序的核心。接着,使用`wx.Frame`创建窗口,设置窗口的标题和其他属性。按钮和文本框等控件可以通过`wx.Button`和`wx.TextCtrl`等类创建,同时指定它们的位置...

    基于python的音乐系统.rar

    在本例中,它包含了一个基于Python的音乐系统的所有源代码和其他可能的资源文件。用户需要先解压才能查看和使用这些内容。 【标签解析】 "源码"标签表明这个压缩包包含的是可读的、未编译的程序代码,用户可以研究...

    基于Python的图书管理系统设计

    Python提供了许多库用于创建图形用户界面,如Tkinter、PyQt或wxPython。选择其中之一,开发者可以设计出包含图书列表、搜索框、借还书按钮等功能的交互式界面,提高用户的操作体验。 在系统设计文档中,通常会包含...

    python例程1.exec动态生成控件.7z

    首先,我们要明白在Python中创建GUI通常会使用一些库,如Tkinter、PyQt、wxPython或Kivy等。以Tkinter为例,它是Python的标准GUI库,提供了许多预定义的控件,如按钮、文本框、列表框等。这些控件可以在程序设计阶段...

    pycharm+python环境配置

    PyCharm支持多种UI库,如Tkinter(Python自带)、Qt(PyQt或PySide)和wxPython等。这里我们以Tkinter为例: 1. 首先,导入Tkinter库: ```python import tkinter as tk ``` 2. 创建主窗口: ```python root = tk....

    王者壁纸 + python

    Python有多个库可用于此目的,如Tkinter(Python标准库)、PyQt、wxPython等。用户可以通过GUI浏览、选择和下载壁纸。 6. **数据结构**: - 在处理文件列表时,可能会用到Python的数据结构,如列表(用于存储...

    Python库 | python3_albow-2.87-py3-none-any.whl

    在本例中,我们关注的是名为`python3_albow-2.87-py3-none-any.whl`的Python库。这个库是专为Python 3设计的,版本号为2.87,它是一个wheel格式的文件,这是一种预编译的Python软件包格式,可以直接安装而无需构建源...

    python实现的窗体软件

    Python提供了多种库和框架来开发这类软件,比如Tkinter(Python的标准GUI库)、PyQt、wxPython等。这些库允许开发者创建交互式的窗体界面,用于各种目的,例如数据可视化、用户输入处理等。在本例中,窗体软件被特别...

Global site tag (gtag.js) - Google Analytics