wxPython在界面中显示图片问题请教

Ace_wgk 2011-04-18 05:37:17
写了一个界面,想在下拉框选择完成的时候同时在界面上生成相对应的图片,以辅助用户对下拉选项的认识。
可是发现子函数里无法对主函数(额,那个init是主函数么?不懂)的初始化后的界面进行操作。。之前遇到过一个
“绑定按钮,点击按钮后在界面形成一句文字”的问题,我用的是在init函数里先预先形成一个空白静态文本,在响应
按钮的子函数里用SetLabel对空白文本框赋值的方法。比较笨,大家能给我一个更好的方法么,感觉现在这个在子函数里
生成图片问题和我遇到的那个子函数里生成文本问题是一样的,但是那个笨方法行不通了,原因是init里不能显示我用qq
截取的空白图片,而且子函数里也不能生成图片覆盖init中原生成的图片。。
求助。。。代码如下:

import wx,os,sys,string
# -*- coding: cp936 -*-
class InFrame(wx.Frame):

def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, '人机交互检索界面',
size=(800, 670))
panel = wx.Panel(self)
self.sampleList3 = ['不确定','二叉形', '新月形','心形或卵形','圆形','近圆形',
'卵圆形','椭圆形','圆球状','圆柱状','披针形','梭形','齿形',]
wx.StaticText(panel, -1, "细胞形态:", (15, 200))
self.choice3 = wx.Choice(panel, -1, (90, 198), choices=self.sampleList3,
name="CellsForm")
self.choice3.Bind(wx.EVT_CHOICE,self.OnChoice3)
def OnChoice3(self,event):
panel=wx.Panel(self)
img3=wx.Image('F:\自习室\python\picture\huxian.jpg',wx.BITMAP_TYPE_ANY).Scale(50,70)
show3=wx.StaticBitmap(panel,-1,wx.BitmapFromImage(img3),pos=(15,500))

if __name__ == '__main__':
app = wx.PySimpleApp()
frame = InFrame(parent=None, id=-1)
frame.Show()
app.MainLoop()
...全文
819 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ace_wgk 2011-04-19
  • 打赏
  • 举报
回复
这个问题解决了。谢谢大家
Ace_wgk 2011-04-18
  • 打赏
  • 举报
回复
嗯,你说的对。更新图片的方法要变化,还是不能实现。。你看我的代码。。

import wx,os,sys,string
# -*- coding: cp936 -*-
class InFrame(wx.Frame):

def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, '人机交互检索界面',
size=(800, 670))
panel = self.panel=wx.Panel(self)
self.sampleList3 = ['不确定','二叉形', '新月形','心形或卵形','圆形','近圆形',
'卵圆形','椭圆形','圆球状','圆柱状','披针形','梭形','齿形',]
wx.StaticText(panel, -1, "细胞形态:", (15, 200))
self.choice3 = wx.Choice(panel, -1, (90, 198), choices=self.sampleList3,
name="CellsForm")
self.choice3.Bind(wx.EVT_CHOICE,self.OnChoice3)
def OnChoice3(self,event):
panel=self.panel
img1=wx.Image('F:\自习室\python\picture\huxian.jpg',wx.BITMAP_TYPE_ANY).Scale(80,100)#这个地方我想把图片修改尺寸为(80,100),但在界面上显示的只是很小的一个图形,做不到啊
img2=wx.Image('F:\自习室\python\picture\liu.jpg',wx.BITMAP_TYPE_ANY).Scale(80,100)
if self.choice3.GetStringSelection().encode('gb2312')=='二叉形':
show1=wx.StaticBitmap(panel,-1,wx.BitmapFromImage(img1),pos=(15,500))
if self.choice3.GetStringSelection().encode('gb2312')=='新月形':
show2=wx.StaticBitmap(panel,-1,wx.BitmapFromImage(img2),pos=(15,500))

if __name__ == '__main__':
app = wx.PySimpleApp()
frame = InFrame(parent=None, id=-1)
frame.Show()
app.MainLoop()


[Quote=引用 9 楼 a590687 的回复:]
引用 7 楼 angel_su 的回复:
一样的图片一样的位置,你怎么触发不是都一样么。一般会依据event或者自设个判断用的参数,先销毁原来的wx.StaticBitmap然后再新建一个新的wx.StaticBitmap在原来的位置

图片位置设计好以后应该不需要动的,只是更新图片的方法要改,这里只是一个图片的例子
[/Quote]
上帝无言 2011-04-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 angel_su 的回复:]
一样的图片一样的位置,你怎么触发不是都一样么。一般会依据event或者自设个判断用的参数,先销毁原来的wx.StaticBitmap然后再新建一个新的wx.StaticBitmap在原来的位置
[/Quote]
图片位置设计好以后应该不需要动的,只是更新图片的方法要改,这里只是一个图片的例子
上帝无言 2011-04-18
  • 打赏
  • 举报
回复
wxPython+in+action中文.pdf 这本书你把 ‘使用sizer放置窗口部件’部分看一看就明白了
angel_su 2011-04-18
  • 打赏
  • 举报
回复
一样的图片一样的位置,你怎么触发不是都一样么。一般会依据event或者自设个判断用的参数,先销毁原来的wx.StaticBitmap然后再新建一个新的wx.StaticBitmap在原来的位置
上帝无言 2011-04-18
  • 打赏
  • 举报
回复
其实就是 增加一个布局,在这个布局里增加一个隐藏的图片单元(我用的是另一个panel,因为他有Show()这个属性),在选择菜单以后调用panel.Show(True)把这个单元显示出来。这样也大概就是你的目的吧。
Ace_wgk 2011-04-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 angel_su 的回复:]
一个frame用1个wx.Panel,你用了2个这样不正常吧,把第一个panel用个self.xxx记住,然后在类的其它地方就可以用了。你的代码简单如下修改试试...
def __init__(...)
...
panel = self.panel = wx.Panel(self)
...
...
def OnChoice3(self,event):
panel = self……
[/Quote]谢谢您的方法,我觉得很好!谢谢,但是我还是用不好啊,只能第一次触发时候显示图片,第二次再触发就不能显示了。。我改后代码如下:希望您指教
我修改后代码如下,

import wx,os,sys,string
# -*- coding: cp936 -*-
class InFrame(wx.Frame):

def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, '人机交互检索界面',
size=(800, 670))
panel = self.panel=wx.Panel(self)
self.sampleList3 = ['不确定','二叉形', '新月形','心形或卵形','圆形','近圆形',
'卵圆形','椭圆形','圆球状','圆柱状','披针形','梭形','齿形',]
wx.StaticText(panel, -1, "细胞形态:", (15, 200))
self.choice3 = wx.Choice(panel, -1, (90, 198), choices=self.sampleList3,
name="CellsForm")
self.choice3.Bind(wx.EVT_CHOICE,self.OnChoice3)
def OnChoice3(self,event):
panel=self.panel
img3=wx.Image('F:\自习室\python\picture\huxian.jpg',wx.BITMAP_TYPE_ANY).Scale(50,70)
show3=wx.StaticBitmap(panel,-1,wx.BitmapFromImage(img3),pos=(15,500))

if __name__ == '__main__':
app = wx.PySimpleApp()
frame = InFrame(parent=None, id=-1)
frame.Show()
app.MainLoop()


Ace_wgk 2011-04-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 a590687 的回复:]
Python code

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


import wx,os,sys,string
# -*- coding: cp936 -*-
class Ipanel(wx.Panel):

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)

……
[/Quote]
谢谢您的回复,我感觉三楼的方法更简练,您的方法我看不大明白,(我太菜了。。)但是三楼的方法我还是用不好啊,只能第一次触发时候显示图片,第二次再触发就不能显示了。。我改后代码如下:希望您指教

import wx,os,sys,string
# -*- coding: cp936 -*-
class InFrame(wx.Frame):

def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, '人机交互检索界面',
size=(800, 670))
panel = self.panel=wx.Panel(self)
self.sampleList3 = ['不确定','二叉形', '新月形','心形或卵形','圆形','近圆形',
'卵圆形','椭圆形','圆球状','圆柱状','披针形','梭形','齿形',]
wx.StaticText(panel, -1, "细胞形态:", (15, 200))
self.choice3 = wx.Choice(panel, -1, (90, 198), choices=self.sampleList3,
name="CellsForm")
self.choice3.Bind(wx.EVT_CHOICE,self.OnChoice3)
def OnChoice3(self,event):
panel=self.panel
img3=wx.Image('F:\自习室\python\picture\huxian.jpg',wx.BITMAP_TYPE_ANY).Scale(50,70)
show3=wx.StaticBitmap(panel,-1,wx.BitmapFromImage(img3),pos=(15,500))

if __name__ == '__main__':
app = wx.PySimpleApp()
frame = InFrame(parent=None, id=-1)
frame.Show()
app.MainLoop()


angel_su 2011-04-18
  • 打赏
  • 举报
回复
一个frame用1个wx.Panel,你用了2个这样不正常吧,把第一个panel用个self.xxx记住,然后在类的其它地方就可以用了。你的代码简单如下修改试试...
def __init__(...)
...
panel = self.panel = wx.Panel(self)
...
...
def OnChoice3(self,event):
panel = self.panel
...
上帝无言 2011-04-18
  • 打赏
  • 举报
回复

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


import wx,os,sys,string
# -*- coding: cp936 -*-
class Ipanel(wx.Panel):

def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)

self.sampleList3 = ['不确定','二叉形', '新月形','心形或卵形','圆形','近圆形',
'卵圆形','椭圆形','圆球状','圆柱状','披针形','梭形','齿形',]
Text = wx.StaticText(self, -1, "细胞形态:", (15, 200))
self.choice3 = wx.Choice(self, -1, (90, 198), choices=self.sampleList3,
name="CellsForm")
self.choice3.Bind(wx.EVT_CHOICE,self.OnChoice3)
#------


self.sizer = wx.BoxSizer(wx.HORIZONTAL)
self.SetSizer(self.sizer)

self.sizer.Add(Text, 0, wx.TOP, 20)
self.sizer.Add(self.choice3, 0, wx.ALL, 15)
self.pl = wx.Panel(self, -1, size=(300, 300))
self.MakePanel2(self.pl)
self.sizer.Add(self.pl, 0, wx.ALL|wx.EXPAND, 15)

self.TR = True
#给你点提示
def OnChoice3(self, evt):

if self.TR:
self.pl.Show(self.TR)
self.TR = False
else:
self.pl.Show(self.TR)
self.TR = True
self.Layout()


def MakePanel2(self, panel):
img3=wx.Image('a.jpg',wx.BITMAP_TYPE_ANY).Scale(300,300)
show3=wx.StaticBitmap(panel,-1,wx.BitmapFromImage(img3), size=(300, 300))
self.pl.Show(False)

class InFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, '人机交互检索界面',
size=(800, 670))
panel = Ipanel(self)

if __name__ == '__main__':
app = wx.PySimpleApp()
frame = InFrame()
frame.Show()
app.MainLoop()

Ace_wgk 2011-04-18
  • 打赏
  • 举报
回复
没有人帮帮我吗?。。。给我提供点参考资料也行啊。。给段代码。。谢谢了

37,743

社区成员

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

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