求助,当循环时,无法按其它按钮

u012847675 2013-11-15 02:45:00


# -*- coding: utf-8 -*-

import wx

import numpy as np

import matplotlib

#matplotlib采用WXAgg为后台,将matplotlib嵌入wxPython中
matplotlib.use("WXAgg")

from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar
from matplotlib.ticker import MultipleLocator, FuncFormatter

import pylab
from matplotlib import pyplot


######################################################################################
class MPL_Panel_base(wx.Panel):
''' #MPL_Panel_base面板,可以继承或者创建实例'''
def __init__(self,parent):
wx.Panel.__init__(self,parent=parent, id=-1)
#初始化

self.Figure = matplotlib.figure.Figure(figsize=(4,3))#设置大小
self.axes = self.Figure.add_axes([0.1,0.1,0.8,0.8])#不太清除
self.FigureCanvas = FigureCanvas(self,-1,self.Figure)#画图工具

self.NavigationToolbar = NavigationToolbar(self.FigureCanvas)#不太清除

self.StaticText = wx.StaticText(self,-1,label='please input 一些东西吧') #静态文本

self.SubBoxSizer = wx.BoxSizer(wx.HORIZONTAL)#box 水平的
self.SubBoxSizer.Add(self.NavigationToolbar,proportion =0, border = 2,flag = wx.ALL | wx.EXPAND)#导航条
self.SubBoxSizer.Add(self.StaticText,proportion =-1, border = 2,flag = wx.ALL | wx.EXPAND)#静态文本

self.TopBoxSizer = wx.BoxSizer(wx.VERTICAL)#垂直的box
self.TopBoxSizer.Add(self.SubBoxSizer,proportion =-1, border = 2,flag = wx.ALL | wx.EXPAND)#上面那个水平box
self.TopBoxSizer.Add(self.FigureCanvas,proportion =-10, border = 2,flag = wx.ALL | wx.EXPAND)#画图

self.SetSizer(self.TopBoxSizer)#依据topboxsizer的大小调整框架

###方便调用????
self.pylab=pylab
self.pl=pylab
self.pyplot=pyplot
self.numpy=np
self.np=np
self.plt=pyplot

def UpdatePlot(self):
'''#修改图形的任何属性后都必须使用self.UpdatePlot()更新GUI界面 '''
self.FigureCanvas.draw()


def plot(self,*args,**kwargs):
'''#最常用的绘图命令plot '''
self.axes.plot(*args,**kwargs)
self.UpdatePlot()

def grid(self,flag=True):
''' ##显示网格 '''
if flag:
self.axes.grid()
else:
self.axes.grid(False)


def title_MPL(self,TitleString="wxMatPlotLib Example In wxPython"):
''' # 给图像添加一个标题 '''
self.axes.set_title(TitleString)


def xlabel(self,XabelString="X"):
''' # Add xlabel to the plotting '''
self.axes.set_xlabel(XabelString)


def ylabel(self,YabelString="Y"):
''' # Add ylabel to the plotting '''
self.axes.set_ylabel(YabelString)


def xticker(self,major_ticker=1.0,minor_ticker=0.5):
''' # 设置X轴的刻度大小 '''
self.axes.xaxis.set_major_locator( MultipleLocator(major_ticker) )
self.axes.xaxis.set_minor_locator( MultipleLocator(minor_ticker) )


def yticker(self,major_ticker=1.0,minor_ticker=0.1):
''' # 设置Y轴的刻度大小 '''
self.axes.yaxis.set_major_locator( MultipleLocator(major_ticker) )
self.axes.yaxis.set_minor_locator( MultipleLocator(minor_ticker) )


def legend(self,*args,**kwargs):
''' #图例legend for the plotting '''
self.axes.legend(*args,**kwargs)


def xlim(self,x_min,x_max):
''' # 设置x轴的显示范围 '''
self.axes.set_xlim(x_min,x_max)


def ylim(self,y_min,y_max):
''' # 设置y轴的显示范围 '''
self.axes.set_ylim(y_min,y_max)


def savefig(self,*args,**kwargs):
''' #保存图形到文件 '''
self.Figure.savefig(*args,**kwargs)


def cla(self):
''' # 再次画图前,必须调用该命令清空原来的图形 '''
self.axes.clear()
self.Figure.set_canvas(self.FigureCanvas)
self.UpdatePlot()

def ShowHelpString(self,HelpString="Show Help String"):
''' #可以用它来显示一些帮助信息,如鼠标位置等 '''
self.StaticText.SetLabel(HelpString)

################################################################



###############################################################################
# MPL_Frame添加了MPL_Panel的1个实例
###############################################################################
class MPL_Frame(wx.Frame):
"""MPL_Frame可以继承,并可修改,或者直接使用"""
def __init__(self,title="MPL_Frame Example In wxPython",size=(800,500)):
wx.Frame.__init__(self,parent=None,title = title,size=size)

self.MPL = MPL_Panel_base(self)

#创建FlexGridSizer
self.FlexGridSizer=wx.FlexGridSizer( rows=9, cols=1, vgap=5,hgap=5)
self.FlexGridSizer.SetFlexibleDirection(wx.BOTH)

self.RightPanel = wx.Panel(self,-1)

#测试按钮1
self.Button1 = wx.Button(self.RightPanel,-1,"TestButton",size=(100,40),pos=(10,10))
self.Button1.Bind(wx.EVT_BUTTON,self.Button1Event)

#测试按钮2
self.Button2 = wx.Button(self.RightPanel,-1,"AboutButton",size=(100,40),pos=(10,10))
self.Button2.Bind(wx.EVT_BUTTON,self.Button2Event)

#加入Sizer中
self.FlexGridSizer.Add(self.Button1,proportion =0, border = 5,flag = wx.ALL | wx.EXPAND)
self.FlexGridSizer.Add(self.Button2,proportion =0, border = 5,flag = wx.ALL | wx.EXPAND)

self.RightPanel.SetSizer(self.FlexGridSizer)

self.BoxSizer=wx.BoxSizer(wx.HORIZONTAL)
self.BoxSizer.Add(self.MPL,proportion =-10, border = 2,flag = wx.ALL | wx.EXPAND)
self.BoxSizer.Add(self.RightPanel,proportion =0, border = 2,flag = wx.ALL | wx.EXPAND)

self.SetSizer(self.BoxSizer)

#状态栏
self.StatusBar()

#MPL_Frame界面居中显示
self.Centre(wx.BOTH)



#按钮事件,用于测试
def Button1Event(self,event):
self.MPL.cla()#必须清理图形,才能显示下一幅图

x=np.arange(-10,10,0.25)
y=np.cos(x)
self.MPL.plot(x,y,'--*g')
self.MPL.xticker(3.0,1)
self.MPL.yticker(0.5,0.1)
self.MPL.title_MPL("MPL1")
self.MPL.ShowHelpString("You Can Show MPL Helpful String Here !")
self.MPL.grid()
self.MPL.UpdatePlot()#必须刷新才能显示

def Button2Event(self,event):
self.AboutDialog()


#自动创建状态栏
def StatusBar(self):
self.statusbar = self.CreateStatusBar()
self.statusbar.SetFieldsCount(3)
self.statusbar.SetStatusWidths([-2, -2, -1])


#About对话框
def AboutDialog(self):
self.MPL.cla()#必须清理图形,才能显示下一幅图
while 1:
x=np.arange(-10,10,0.25)
y=np.cos(x)
self.MPL.plot(x,y,'--*g')
self.MPL.xticker(2.0,0.5)
self.MPL.yticker(0.5,0.1)
self.MPL.title_MPL("MPL1")
self.MPL.ShowHelpString("You Can Show MPL Helpful String Here !")
self.MPL.grid()
self.MPL.UpdatePlot()#必须刷新才能显示


########################################################################

#主程序测试
if __name__ == '__main__':
app = wx.PySimpleApp()

frame =MPL_Frame()
frame.Center()
frame.Show()
app.MainLoop()
...全文
219 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
junlinfushi 2013-11-15
  • 打赏
  • 举报
回复
引用 3 楼 angel_su 的回复:
gui线程里,不能用死循环代码,这样阻塞无法返回消息机制,界面将无响应。要绘图的话搞到另一个线程也不方便,建议用定时器(wx.Timer或 wx.CallLater)去触发,或者绑定IDLE事件...
angel_su 2013-11-15
  • 打赏
  • 举报
回复
gui线程里,不能用死循环代码,这样阻塞无法返回消息机制,界面将无响应。要绘图的话搞到另一个线程也不方便,建议用定时器(wx.Timer或 wx.CallLater)去触发,或者绑定IDLE事件...
ImN1 2013-11-15
  • 打赏
  • 举报
回复
线程或微线程
u012847675 2013-11-15
  • 打赏
  • 举报
回复
上面有两个 button,当按下第二个是button,AboutButton时,系统在不断循环,无法按TestButton按钮,应该如何让修改呢?

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

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