wxpython自定义控件_WXPYTHON的控件继承改变外观

懵懂先生 投稿文章wxpython自定义控件_WXPYTHON的控件继承改变外观已关闭评论32阅读模式

文章源自略懂百科-http://wswcn.cn/97498.html

创建自定义组件

工具包通常只提供最常见的小部件,如按钮、文本小部件、滚动条、滑块等,没有一个工具包能提供所有可能的小部件。wxPython有很多组件,更多的组件是由客户程序员创建的,我们可以通过两种方式创建自定义组件:一是修改或增强现有的小部件,二是创建自定义组件。文章源自略懂百科-http://wswcn.cn/97498.html

自定义组件的创建有两种方式:一是修改或增强现有的组件,二是从头开始创建一个自定义组件。文章源自略懂百科-http://wswcn.cn/97498.html

一个超链接组件

第一个例子将创建一个超链接。超链接部件将基于现有的wx.lib.stattext.GenStaticText部件。文章源自略懂百科-http://wswcn.cn/97498.html

hyperlink.pyimport wx
from wx.lib.stattext import GenStaticText
import webbrowserclassLink(GenStaticText):def__init__(self, *args, **kw):super(Link,self).__init__(*args, **kw)self.font1 = wx.Font(11, wx.SWISS, wx.NORMAL, wx.BOLD, True,Verdana)self.font2 = wx.Font(11, wx.SWISS, wx.NORMAL, wx.BOLD, False,Verdana)self.SetFont(self.font2)self.SetForegroundColour(0000ff)self.Bind(wx.EVT_MOUSE_EVENTS,self.OnMouseEvent)self.Bind(wx.EVT_MOTION,self.OnMouseEvent)defSetUrl(self, url):self.url = urldefOnMouseEvent(self, e):ife.Moving():self.SetCursor(wx.Cursor(wx.CURSOR_HAND))self.SetFont(self.font1)文章源自略懂百科-http://wswcn.cn/97498.html

elif e.LeftUp():文章源自略懂百科-http://wswcn.cn/97498.html

webbrowser.open_new(self.url)else:self.SetCursor(wx.NullCursor)self.SetFont(self.font2)文章源自略懂百科-http://wswcn.cn/97498.html

e.Skip()classExample(wx.Frame):def__init__(self, *args, **kw):super(Example,self).__init__(*args, **kw)self.InitUI()defInitUI(self):文章源自略懂百科-http://wswcn.cn/97498.html

panel = wx.Panel(self)文章源自略懂百科-http://wswcn.cn/97498.html

vbox = wx.BoxSizer(wx.VERTICAL)
hbox = wx.BoxSizer(wx.HORIZONTAL)文章源自略懂百科-http://wswcn.cn/97498.html

st = GenStaticText(panel, label=Go to web site:)
st.SetFont(wx.Font(11, wx.SWISS, wx.NORMAL, wx.BOLD, False,Verdana))
hbox.Add(st, flag=wx.LEFT, border=20)文章源自略懂百科-http://wswcn.cn/97498.html

link_wid = Link(panel, label=ZetCode)
link_wid.SetUrl(http://www.zetcode.com)
hbox.Add(link_wid, flag=wx.LEFT, border=20)文章源自略懂百科-http://wswcn.cn/97498.html

vbox.Add(hbox, flag=wx.TOP, border=30)
panel.SetSizer(vbox)self.SetTitle(A Hyperlink)self.Centre()defmain():文章源自略懂百科-http://wswcn.cn/97498.html

app = wx.App()
ex = Example(None)
ex.Show()
app.MainLoop()if__name__==__main__:
main()文章源自略懂百科-http://wswcn.cn/97498.html

这个超链接组件是基于一个现有的组件。在这个例子中,我们不画任何东西,只是使用一个现有的组件,我们对其进行了一些修改。文章源自略懂百科-http://wswcn.cn/97498.html

from wx.lib.stattextimportGenStaticTextimportwebbrowser文章源自略懂百科-http://wswcn.cn/97498.html

在这里,我们导入基础widget,从它那里我们得到了超链接widget和webbrowser模块。webbrowser 模块是一个标准的 Python 模块。我们将用它来打开默认浏览器中的链接。文章源自略懂百科-http://wswcn.cn/97498.html

self.SetFont(self.font2)self.SetForegroundColour(0000ff)文章源自略懂百科-http://wswcn.cn/97498.html

创建一个超链接组件背后的想法很简单,我们从一个基本的wx.lib.stattext.GenStaticText小组件类继承。所以我们有了一个文本小组件。然后我们对它进行一些修改。我们改变文字的字体和颜色。文章源自略懂百科-http://wswcn.cn/97498.html

ife.Moving():self.SetCursor(wx.Cursor(wx.CURSOR_HAND))self.SetFont(self.font1)文章源自略懂百科-http://wswcn.cn/97498.html

如果我们将鼠标指针悬停在链接上,就会将字体改为下划线,同时也将鼠标指针改为手标。文章源自略懂百科-http://wswcn.cn/97498.html

elife.LeftUp():webbrowser.open_new(self.url)文章源自略懂百科-http://wswcn.cn/97498.html

如果我们左键点击链接,就会在默认的浏览器中打开链接。文章源自略懂百科-http://wswcn.cn/97498.html

Burning widget

这是一个我们从头开始创建widget的例子,我们在窗口底部放置一个wx.Panel,然后手动绘制整个widget。如果你曾经刻录过CD或DVD,你已经看到过这种widget。文章源自略懂百科-http://wswcn.cn/97498.html

burning.pyimport wxclassBurning(wx.Panel):def__init__(self, parent):
wx.Panel.__init__(self, parent, size=(-1,30), style=wx.SUNKEN_BORDER)self.parent = parentself.font = wx.Font(9, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL,
wx.FONTWEIGHT_NORMAL, False,Courier 10 Pitch)self.Bind(wx.EVT_PAINT,self.OnPaint)self.Bind(wx.EVT_SIZE,self.OnSize)defOnPaint(self, e):文章源自略懂百科-http://wswcn.cn/97498.html

num = range(75,700,75)
dc = wx.PaintDC(self)
dc.SetFont(self.font)
w, h =self.GetSize()self.cw =self.parent.GetParent().cw文章源自略懂百科-http://wswcn.cn/97498.html

step = int(round(w /10.0))文章源自略懂百科-http://wswcn.cn/97498.html

j =0till = (w /750.0) *self.cw
full = (w /750.0) *700ifself.cw >=700:文章源自略懂百科-http://wswcn.cn/97498.html

dc.SetPen(wx.Pen(FFFFB8))
dc.SetBrush(wx.Brush(FFFFB8))
dc.DrawRectangle(0,0, full,30)
dc.SetPen(wx.Pen(ffafaf))
dc.SetBrush(wx.Brush(ffafaf))
dc.DrawRectangle(full,0, till-full,30)else:dc.SetPen(wx.Pen(FFFFB8))
dc.SetBrush(wx.Brush(FFFFB8))
dc.DrawRectangle(0,0, till,30)文章源自略懂百科-http://wswcn.cn/97498.html

dc.SetPen(wx.Pen(5C5142))foriinrange(step,10*step, step):文章源自略懂百科-http://wswcn.cn/97498.html

dc.DrawLine(i,0, i,6)
width, height = dc.GetTextExtent(str(num[j]))
dc.DrawText(str(num[j]), i-width/2,8)
j = j +1defOnSize(self, e):self.Refresh()classExample(wx.Frame):def__init__(self, *args, **kwargs):super(Example,self).__init__(*args, **kwargs)self.InitUI()defInitUI(self):self.cw =75panel = wx.Panel(self)
CenterPanel = wx.Panel(panel)self.sld = wx.Slider(CenterPanel, value=75, maxValue=750, size=(200, -1),
style=wx.SL_LABELS)文章源自略懂百科-http://wswcn.cn/97498.html

vbox = wx.BoxSizer(wx.VERTICAL)
hbox = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
hbox3 = wx.BoxSizer(wx.HORIZONTAL)self.wid = Burning(panel)
hbox.Add(self.wid,1, wx.EXPAND)文章源自略懂百科-http://wswcn.cn/97498.html

hbox2.Add(CenterPanel,1, wx.EXPAND)
hbox3.Add(self.sld,0, wx.LEFT|wx.TOP, 35)文章源自略懂百科-http://wswcn.cn/97498.html

CenterPanel.SetSizer(hbox3)文章源自略懂百科-http://wswcn.cn/97498.html

vbox.Add(hbox2, 1, wx.EXPAND)
vbox.Add(hbox, 0, wx.EXPAND)self.Bind(wx.EVT_SCROLL,self.OnScroll)文章源自略懂百科-http://wswcn.cn/97498.html

panel.SetSizer(vbox)self.sld.SetFocus()self.SetTitle("Burning widget")self.Centre()文章源自略懂百科-http://wswcn.cn/97498.html

def OnScroll(self, e):self.cw =self.sld.GetValue()self.wid.Refresh()文章源自略懂百科-http://wswcn.cn/97498.html

def main():文章源自略懂百科-http://wswcn.cn/97498.html

app = wx.App()
ex = Example(None)
ex.Show()
app.MainLoop()if__name__ == __main__:
main()文章源自略懂百科-http://wswcn.cn/97498.html

这个小工具以图形方式显示了一个介质的总容量和我们可用的空间。该小组件由一个滑块控制。我们自定义部件的最小值是0,最大值是750。如果我们达到700,我们就开始用红色绘制。这通常表示过度燃烧。文章源自略懂百科-http://wswcn.cn/97498.html

w, h =self.GetSize()self.cw =self.parent.GetParent().cw
...
till = (w /750.0) *self.cw
full = (w /750.0) *700文章源自略懂百科-http://wswcn.cn/97498.html

我们动态地绘制小部件。窗口越大,燃烧的部件越大。反之亦然。这就是为什么我们必须计算wx.Panel的大小,并在其上绘制自定义小组件。till参数决定了要绘制的总尺寸。这个值来自于滑块部件。它是整个区域的一个比例。full参数决定了我们开始用红色绘制的点。注意使用浮点运算。这是为了达到更高的精度。文章源自略懂百科-http://wswcn.cn/97498.html

实际的绘制包括三个步骤。我们绘制黄色或红色和黄色的矩形。然后我们画出垂直线,将部件分成几个部分。最后,我们画出数字,这表示介质的容量。文章源自略懂百科-http://wswcn.cn/97498.html

defOnSize(self, e):self.Refresh()文章源自略懂百科-http://wswcn.cn/97498.html

每次调整窗口大小时,我们都会刷新小组件。这将导致小组件重新绘制自己。文章源自略懂百科-http://wswcn.cn/97498.html

defOnScroll(self, e):self.cw =self.sld.GetValue()self.wid.Refresh()文章源自略懂百科-http://wswcn.cn/97498.html

如果我们滚动滑块,我们就会得到实际值并将其保存到self.cw参数中。当燃烧的widget被绘制时,就会使用这个值。然后,我们将重新绘制该小组件。文章源自略懂百科-http://wswcn.cn/97498.html

CPU widget

有一些系统应用程序可以测量系统资源,如温度、内存或CPU消耗。为了使应用程序更有吸引力,我们创建了专门的组件。文章源自略懂百科-http://wswcn.cn/97498.html

以下是系统应用程序中经常使用的组件件。文章源自略懂百科-http://wswcn.cn/97498.html

cpu.pyimport wxclassCPU(wx.Panel):def__init__(self, parent):
wx.Panel.__init__(self, parent, size=(80,110))self.parent = parentself.SetBackgroundColour(000000)self.Bind(wx.EVT_PAINT,self.OnPaint)defOnPaint(self, e):文章源自略懂百科-http://wswcn.cn/97498.html

dc = wx.PaintDC(self)文章源自略懂百科-http://wswcn.cn/97498.html

dc.SetDeviceOrigin(0,100)
dc.SetAxisOrientation(True, True)文章源自略懂百科-http://wswcn.cn/97498.html

pos =self.parent.GetParent().GetParent().sel
rect = pos /5foriinrange(1,21):ifi >rect:dc.SetBrush(wx.Brush(075100))
dc.DrawRectangle(10, i*4,30,5)
dc.DrawRectangle(41, i*4,30,5)else:dc.SetBrush(wx.Brush(36ff27))
dc.DrawRectangle(10, i*4,30,5)
dc.DrawRectangle(41, i*4,30,5)classExample(wx.Frame):def__init__(self, *args, **kwargs):super(Example,self).__init__(*args, **kwargs)self.InitUI()defInitUI(self):self.sel =0panel = wx.Panel(self)
centerPanel = wx.Panel(panel)self.cpu = CPU(centerPanel)文章源自略懂百科-http://wswcn.cn/97498.html

hbox = wx.BoxSizer(wx.HORIZONTAL)self.slider = wx.Slider(panel, value=self.sel, maxValue=100, size=(-1,100),
style=wx.VERTICAL| wx.SL_INVERSE)self.slider.SetFocus()文章源自略懂百科-http://wswcn.cn/97498.html

hbox.Add(centerPanel, 0, wx.LEFT |wx.TOP,20)
hbox.Add(self.slider,0, wx.LEFT| wx.TOP, 30)self.Bind(wx.EVT_SCROLL,self.OnScroll)文章源自略懂百科-http://wswcn.cn/97498.html

panel.SetSizer(hbox)self.SetTitle("CPU")self.Centre()文章源自略懂百科-http://wswcn.cn/97498.html

def OnScroll(self, e):self.sel = e.GetInt()self.cpu.Refresh()文章源自略懂百科-http://wswcn.cn/97498.html

def main():文章源自略懂百科-http://wswcn.cn/97498.html

app = wx.App()
ex = Example(None)
ex.Show()
app.MainLoop()if__name__ == __main__:
main()文章源自略懂百科-http://wswcn.cn/97498.html

我们创建一个黑色的面板。然后我们在这个面板上绘制小矩形。矩形的颜色取决于滑块的值。颜色可以是深绿色或亮绿色。文章源自略懂百科-http://wswcn.cn/97498.html

dc.SetDeviceOrigin(0,100)dc.SetAxisOrientation(True,True)文章源自略懂百科-http://wswcn.cn/97498.html

这里我们把默认的坐标系改成了笛卡尔坐标系。这是为了让绘图更直观。文章源自略懂百科-http://wswcn.cn/97498.html

pos= self.parent.GetParent().GetParent().selrect= pos /5文章源自略懂百科-http://wswcn.cn/97498.html

在这里,我们得到sizer的值。我们每列有20个矩形。滑块有100个数字。矩形参数将滑块的值转换为矩形,并以亮绿色绘制。文章源自略懂百科-http://wswcn.cn/97498.html

foriinrange(1,21):ifi>rect:dc.SetBrush(wx.Brush(075100))dc.DrawRectangle(10,i*4,30,5)dc.DrawRectangle(41,i*4,30,5)else:dc.SetBrush(wx.Brush(36ff27))dc.DrawRectangle(10,i*4,30,5)dc.DrawRectangle(41,i*4,30,5)文章源自略懂百科-http://wswcn.cn/97498.html

这里我们画40个矩形,每列20个。如果被画的矩形数量大于换算后的矩形值,我们就用深绿色画,否则就用亮绿色画。文章源自略懂百科-http://wswcn.cn/97498.html

文章源自略懂百科-http://wswcn.cn/97498.html

懵懂先生
  • 本文由 发表于 2023年2月27日 16:36:31
  • 转载请注明:http://wswcn.cn/97498.html
投稿文章

拉应力和压应力怎么判断(拉应力和压应力的关系)

估计大家经常会遇到一个问题,那就是我们在计算疲劳时要不要考虑压应力? 我们先来看看ASM international(世界上最大的以材料为中心的工程师和科学家协会)是怎么说的:疲劳是渐进的、局部的、永...
投稿文章

手麻是什么病(手麻可能是什么病)

有时我们趴着睡觉、枕着手臂等不正确的睡姿就会引起手部血液循环不畅从而导致手麻等不适症状。但是,如果有持续手麻的现象,或是间歇性的手麻,往往可能是某些疾病发出的信号,应该及时到医院检查。 1、颈椎病 这...
投稿文章

海马7x发动机怎么样(海马1(5t发动机怎么样)

在全国人民都还没听过旅行车这个词,脑中更加没这个概念的时候,作为海马前身的海南马自达,在合资建立后实现国产的第一款车型就是929 Station Wagon。当然,它在国内还有一个大家都更熟悉的名字:...
投稿文章

多媒体计算机的组成是什么(全方面了解计算机构成)

多媒体相关基础概念 媒体:表示传输信息的载体,通常指文字、声音、图像、动画和视频等形式。 多媒体技术:指能够同时对两种或两种以上媒体进行采集、操作、编辑、存储的综合处理技术。 多媒体特性:多样性、交互...