【发布时间】:2013-11-15 21:57:43
【问题描述】:
我正在使用 wxPython 编写 Solitaire GUI,并且我在 Windows 7 上。我之前只写过一个 GUI(在 Java Swing 中),所以我对所有不同的东西都不太熟悉小部件和控件的类型。我面临着在 Solitaire 板的 Tableaux 中拥有可调整大小、层叠的卡片堆的挑战。对我来说,为每张卡片使用 BitmapButtons(或至少用于正面卡片)并让面板包含一堆卡片似乎很自然,因为在纸牌中将 Tableau 中的子卡片堆从一堆移动到另一堆是合法的.我确信有更好的方法来做到这一点,但现在我一直在摆弄一个较小的 GUI(不是我的主 GUI)来尝试实现这一点。我在下面附上了测试 GUI 的代码。
注意:我的主 GUI 使用 GridBagSizer 与 14 个单元格。我没有尝试在 GridBagSizer 中使用以下面板/按钮,甚至不知道 GridBagSizer 是否是解决此问题的最佳方式。
import wx
class MyFrame(wx.Frame):
def __init__(self, parent, id_, title):
wx.Frame.__init__(self, parent, id_, title, size=(810, 580))
self.panel = wx.Panel(self, size=(72, 320), pos=(20,155))
self.buttons = []
self.init_buttons()
def init_buttons(self):
for i in range(6):
face_down = wx.Image('img/cardback.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()
wid = face_down.GetWidth()
hgt = face_down.GetHeight()
bmpbtn = wx.BitmapButton(self.panel, -1, bitmap=face_down, pos=(20,155+7*i), size=(wid, hgt))
bmpbtn.Bind(wx.EVT_ENTER_WINDOW, self.onMouseOver)
self.buttons.append(bmpbtn)
for i in range(1,14):
rank = 14 - i
if i % 2 == 0:
filename = 'img/%sC.png' % rank
else:
filename = 'img/%sH.png' % rank
img = wx.Image(filename, wx.BITMAP_TYPE_PNG).ConvertToBitmap()
wid = img.GetWidth()
hgt = img.GetHeight()
bmpbtn = wx.BitmapButton(self.panel, -1, bitmap=img, pos=(20, 177+20*i), size=(wid, hgt))
bmpbtn.Bind(wx.EVT_ENTER_WINDOW, self.onMouseOver)
self.buttons.append(bmpbtn)
def onMouseOver(self, event):
#event.Skip()
pass
class MyApp(wx.App):
def OnInit(self):
wx.InitAllImageHandlers()
self.frame = MyFrame(None, -1, "Solitaire")
self.frame.Show(True)
self.SetTopWindow(self.frame)
return True
app = MyApp(0)
app.MainLoop()
这是运行的结果:
http://oi44.tinypic.com/1zv4swj.jpg
我很满意,直到我将鼠标移到一些按钮上:
http://oi44.tinypic.com/2rdupmq.jpg
这一定与 EVT_ENTER_WINDOW 事件有关。我试图编写一个事件处理程序,但意识到我并不真正知道如何实现我所需要的。根据文档,BitmapButton 的每个状态都有不同的位图 - 悬停、焦点、选定、非活动等。但是,我不想在鼠标悬停事件上更改位图。我只是想让按钮保持原样,而不是显示在其他按钮之上。
任何帮助将不胜感激。顺便说一句,如果有人对实现此 GUI 的更好方法(比 GridBagSizer 和这些按钮面板)提出建议,我会很高兴的!
【问题讨论】:
标签: button user-interface wxpython