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()
...全文
762 11 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
没有人帮帮我吗?。。。给我提供点参考资料也行啊。。给段代码。。谢谢了
本课程采用了漫画+动手实操+练习讲授Python编程技能。课程简介:第11章 常用内置模块11.1 数学计算模块 —— math模块11.2 日期时间模块 —— datetime模块11.2.1 datetime类11.2.2 date类11.2.3 time类11.2.4 计算时间跨度类——timedelta11.2.5 将日期时间对象与字符串相互转换11.3 正则表达式模块 —— re模块11.3.1 字符串匹配11.3.2 字符串查找11.3.3 字符串替换11.3.4 字符串分割11.5 练一练第12章 文件读写12.1 打开文件12.2 关闭文件12.2.1 在finally代码块关闭文件12.2.2 在with as代码块关闭文件12.3 读写文本文件12.4 动动手 —— 复制文本文件12.5 读写二进制文件12.6 动动手 —— 复制二进制文件12.1 练一练第13章 图形用户界面13.1 Python的图形用户界面开发库13.2 安装wxPython17813.3 第一个wxPython程序18013.4 自定义窗口类18213.5 在窗口添加控件18213.6 事件处理18413.7 布局管理18513.7.1 盒子布局管理器18613.7.2 动动手——重构事件处理示例13.7.3 动动手——盒子布局管理器嵌套示例13.8 控件13.8.1 文本输入控件13.8.2 复选框和单选按钮13.8.3 列表13.8.4 静态图片控件13.9 点拨点拨 —— 如何使用wxPython官方文档13.10 练一练第14章 网络通信14.1 基本的网络知识14.1.1 TCP/IP14.1.2 IP地址14.1.3 端口14.1.4 HTTP/HTTPS14.2 搭建自己的Web服务器14.3 urllib.request模块14.3.1 发送GET请求14.3.2 发送POST请求14.4 JSON数据14.4.1 JSON文档的结构14.4.2 对JSON数据的解码14.5 动动手 —— 下载图片示例14.6 动动手 —— 返回所有备忘录信息14.7 练一练第15章 访问数据库15.1 SQLite15.1.1 SQLite的数据类型15.1.2 Python的数据类型与SQLite的数据类型的映射15.1.3 使用GUI管理工具管理SQLite15.2 数据库编程的基本操作过程15.3.1 数据库连接对象Connection15.3.2 游标对象Cursor15.4 动动手 —— 数据库的CRUD操作示例15.4.1 示例的数据表15.4.2 无条件查询15.4.3 有条件查询15.4.4 插入数据15.4.5 更新数据15.4.6 删除数据15.5 点拨点拨 —— 防止SQL注入攻击15.6 练一练第16章 多线程16.1 线程相关的知识16.1.1 进程16.1.2 线程16.1.3 主线程16.2 线程模块 —— threading模块16.3 创建子线程16.3.1 自定义函数实现线程体16.3.2 自定义线程类实现线程体16.4 线程管理16.4.1 等待线程结束16.4.2 线程停止16.5 动动手 —— 下载图片示例16.6 练一练

37,719

社区成员

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

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