您好,我知道可以使用列表来执行此操作,但是可以使用组合框执行此操作吗?有没有类似set的函数?
我尝试将 set 与组合框一起使用,但收到以下错误: AttributeError: 'ComboBox' object has no attribute 'Set'
谢谢。
我正在编写一个 wxPython 应用程序,需要与现有 Windows 应用程序的外观相匹配。我试图将静态文本和按钮控件放在具有渐变背景的面板上。以下是我找到的方法,但我不禁觉得自己错过了一些东西。我应该如何绘制静态文本和自定义控件并让背景显示出来?
msw.window.no-clip-children让背景透出来?2 似乎最简单,但我想知道它是否因某种原因被关闭。在全球范围内打开无剪辑儿童是否会对性能产生影响?有什么办法可以只为我想要的窗口打开它吗?
编辑:示例代码和屏幕截图
抱歉,如果这看起来像是问题的答案。我想知道是否有正确的方法可以做到这一点。

#!/usr/bin/python
import wx
class GradientPanel(wx.Panel):
def __init__(self,*args,**kwargs):
wx.Panel.__init__(self,*args,**kwargs)
self.Bind(wx.EVT_PAINT,lambda e: self.paintBackground())
self.Bind(wx.EVT_ERASE_BACKGROUND,lambda e: None)
self.t=wx.StaticText(self,pos=(30,20),label="wxStaticText. Looks bad on MSW")
self.t2=MyStaticText(self,pos=(30,50), size=(300,25), label="MyStaticText. Needs ClipChildren turned off")
self.t3=MyStaticTextWithCustomBackground(self,pos=(30,80),size=(300,25), label="This Control touches up its own background",paintBackgroundToDC=self.paintBackgroundToDC)
def paintBackground(self):
dc=wx.PaintDC(self)
self.paintBackgroundToDC(self,dc)
def paintBackgroundToDC(self,ofWindow,dc=None):
r=self.GetScreenRect()
r.SetTopLeft(ofWindow.ScreenToClient(r.GetTopLeft()))
dc.GradientFillLinear(r,wx.Colour(240,240,240),wx.Colour(128,128,255),wx.SOUTH)
class MyStaticText(wx.Window):
def __init__(self,parent,label,**kwargs):
wx.Window.__init__(self,parent,**kwargs)
self.label=label
self.Bind(wx.EVT_PAINT,lambda e: self.repaint())
self.Bind(wx.EVT_ERASE_BACKGROUND,lambda e: None)
def repaint(self):
self.repaintToDC(wx.PaintDC(self))
def repaintToDC(self,dc):
dc.DrawText(self.label,0,0)
class MyStaticTextWithCustomBackground(MyStaticText): …Run Code Online (Sandbox Code Playgroud) 我是Python新手。我正在尝试编写一个运动检测应用程序。目前,我正在尝试让网络摄像头视频显示在屏幕上。目前的代码一开始没有闪烁,但在调整大小后,闪烁将会回来。有什么线索吗?另外,为什么它在计时器事件中没有 self.Refresh() 的情况下不起作用,除非框架最小化,否则绘制事件不是总是发生?提前致谢。
import wx
import cv
class LiveFrame(wx.Frame):
fps = 30
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, title="Live Camera Feed")
self.SetDoubleBuffered(True)
self.capture = None
self.bmp = None
#self.displayPanel = wx.Panel(self,-1)
#set up camaera init
self.capture = cv.CaptureFromCAM(0)
frame = cv.QueryFrame(self.capture)
if frame:
cv.CvtColor(frame,frame,cv.CV_BGR2RGB)
self.bmp = wx.BitmapFromBuffer(frame.width,frame.height,frame.tostring())
self.SetSize((frame.width,frame.height))
self.displayPanel = wx.Panel(self,-1)
self.fpstimer = wx.Timer(self)
self.fpstimer.Start(1000/self.fps)
self.Bind(wx.EVT_TIMER, self.onNextFrame, self.fpstimer)
self.Bind(wx.EVT_PAINT, self.onPaint)
self.Show(True)
def updateVideo(self):
frame = cv.QueryFrame(self.capture)
if frame:
cv.CvtColor(frame,frame,cv.CV_BGR2RGB)
self.bmp.CopyFromBuffer(frame.tostring())
self.Refresh()
def onNextFrame(self,evt):
self.updateVideo()
#self.Refresh()
evt.Skip()
def onPaint(self,evt):
#if self.bmp: …Run Code Online (Sandbox Code Playgroud) 如果我有两个对象将调用相同的方法,然后发生一个事件,是否可以看到其中哪个对象调用了该事件?
为了让它更清楚。如果我有两个按钮和一个被调用的方法,那么我会单击它们。在此方法中我可以做什么来查看单击了哪个按钮?
...
buttonA.Bind(wx.EVT_BUTTON ,self.methode)
buttonB.Bind(wx.EVT_BUTTON ,self.methode)
...
...
def methode(self,event)
#get the button that was clicked
Run Code Online (Sandbox Code Playgroud) 在 wxpython 中可以使整个框架透明SetTransparent(val)。但是我可以将其中的单个面板设为透明吗?
我尝试使用panelobj.SetTransparent(val)但没有用。
import wx
class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title,size=(250, 250))
topPanel = wx.Panel(self)
panel1 = wx.Panel(topPanel, -1)
panel1.SetTransparent(100)
panel2 = wx.Panel(topPanel, -1)
panel2.SetBackgroundColour('gray')
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(panel1,1,flag = wx.EXPAND|wx.ALL)
sizer.Add(panel2,1,flag = wx.EXPAND|wx.ALL)
topPanel.SetSizer(sizer)
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'frame')
frame.Show(True)
return True
app = MyApp(0)
app.MainLoop()
Run Code Online (Sandbox Code Playgroud)
假设我想为 panel1 设置透明度。
我有一个内置的应用程序,其中包含一个用 wxPython 制作的窗口,其中包含一个用于接受用户输入的文本框,并且该enter事件绑定到一个函数并向其发送一个 wx.Frame 对象。输入值通过以下方式访问self.txt.GetValue()
我需要为该函数编写一些单元测试,但似乎无法找到一种方法来创建参数并将其传递给函数,以便仍然可以使用相同的语句访问该值。
我还发现了许多用于测试 python 应用程序的模块,包括 wxPython 页面(pyunit)上的一个,但如何传递值的主要直觉尚不清楚。
我该怎么做呢?
我正在尝试将包含图像的文件夹嵌入到生成的(使用 PyInstaller)可执行文件中。但这对我不起作用。即使只有一张简单的图像!
我的main.spec文件中的 datas 变量如下所示:
datas=[ ('C:\\Users\\<user>\\dir1\\dir2\\MyApp\\images\\*.png', 'images') ],
Run Code Online (Sandbox Code Playgroud)
根据文档:
第一个字符串指定当前系统中的一个或多个文件。第二个指定运行时包含文件的文件夹的名称。
在 python 文件中,我读取了这样的图像:
self.SetIcon(wx.Icon("images\\myicon.png"))
Run Code Online (Sandbox Code Playgroud)
最后,这是我使用 PyInstaller 将所有内容打包到 *.exe 中的方法:
pyinstaller --onefile --windowed --icon=images\main32x32.ico main.spec
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Failed to load image from file "images\myicon.png"
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我我做错了什么吗?
如何wx Python在Jupyter笔记本中运行模块并成功执行代码?
我正在制作我自己的按钮类,我用DC绘制的面板的子类,我需要在按下自定义按钮时触发wx.EVT_BUTTON.我该怎么做?
我在Windows7上,使用Python 2.6和wxPython 2.8.10.1.我试图让这个打开文件对话框工作,但我遇到了一个奇怪的错误.这对我来说看起来像一个有效的通配符字符串,但每当我选择一个文件并在文件对话框中单击"确定"时,我会得到:
Traceback (most recent call last):
File "D:\Projects\python\wxTest.py", line 92, in OnOpen
self.__DoOpen()
File "D:\Projects\python\wxTest.py", line 101, in __DoOpen
if open_dlg.ShowModal() == wx.ID_OK:
File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_windows.py", line 711, in ShowModal
return _windows_.Dialog_ShowModal(*args, **kwargs)
wx._core.PyAssertionError: C++ assertion "wxAssertFailure" failed at
..\..\src\common\filefn.cpp(1746) in wxParseCommonDialogsFilter():
missing '|' in the wildcard string!
Run Code Online (Sandbox Code Playgroud)
当对话框打开时,一切看起来都很好.有任何想法吗?
编辑:输入太快,忘了包含有问题的通配符字符串!抱歉...
wcd = "All files(*.*)|*.*|Text files (*.txt)|*.txt|"
open_dlg = wx.FileDialog(self, message='Choose a file', defaultDir=directory, defaultFile='', style=wx.OPEN | wx.CHANGE_DIR)
open_dlg.SetWildcard(wcd)
if open_dlg.ShowModal() == wx.ID_OK:
path = open_dlg.GetPath()
...
Run Code Online (Sandbox Code Playgroud) wxpython ×10
python ×9
events ×2
opencv ×1
pyinstaller ×1
python-2.7 ×1
python-3.x ×1
unit-testing ×1
webcam ×1
windows ×1