2013-01-10 55 views
0

我很喜欢wx,我在5天前开始学习它。我正在尝试用像位图按钮这样的卡片来制作类似于内存的游戏,但事件不希望绑定在我的卡片上。我搜查了互联网,并要求一些人寻求帮助,但他们不知道为什么。我把这个程序发给了一个在Linux Fedora上工作的人,他说这个程序有效...... 问题出在MyDialog类的功能卡片上。我制作了一个类似于这个测试程序的测试程序,并将其中的for命令绑定到正确运行的地方。 很抱歉,如果答案这个网站上的某个地方存在,我无法找到它......适用于Fedora,但不适用于Windows,wx.Phyton

import random 
import wx 
global n 
global ControlVar 
ControlVar = False 


class MyDialog(wx.Dialog): 
    def __init__(self, parent, id, title): 
     wx.Dialog.__init__(self, parent, id, title, size=(200, 150)) 
     wx.StaticBox(self, -1, 'Card pairs', (5, 5), size=(180, 70)) 
     wx.StaticText(self, -1, 'Number: ', (15, 40)) 

     self.spin = wx.SpinCtrl(self, -1, '1', (65, 40), (60, -1), min=3, max=5) 
     self.spin.SetValue(4) 
     wx.Button(self, 2, 'Ok', (70, 85), (60, -1)) 
     self.Bind(wx.EVT_BUTTON, self.OnClose, id=2) 
     self.Centre() 
     self.ShowModal() 
     self.Destroy() 

    def OnClose(self, event): 
     pair = self.spin.GetValue() 
     self.Close() 
     return(pair) 


class MyMenu(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(1000, 700)) 
     self.SetMinSize(wx.Size(400, 300)) 
     self.panel = wx.Panel(self, wx.ID_ANY) 
     self.SetIcon(wx.Icon('computer.png', wx.BITMAP_TYPE_ANY)) 


     bmp = wx.Image('wood.png', wx.BITMAP_TYPE_ANY).ConvertToBitmap() 
     bitmap = wx.StaticBitmap(self, -1, bmp, (0, 0)) 

     menubar = wx.MenuBar() 
     file = wx.Menu() 
     edit = wx.Menu() 

     file.Append(101, '&New Game', 'Start a New Game') 
     file.AppendSeparator() 
     file.Append(105,'&Quit\tEsc', 'Quit the Application')   

     menubar.Append(file, '&File') 
     self.SetMenuBar(menubar) 
     self.statusbar = self.CreateStatusBar() 
     self.Centre() 

     self.Bind(wx.EVT_MENU, self.OnNew, id=101) 
     self.Bind(wx.EVT_MENU, self.OnQuit, id=105) 
     self.panel.Bind(wx.EVT_KEY_DOWN, self.OnKey) 

    def OnNew(self, event): 
     if ControlVar: 
      for i in range(n*2): 
       self.dugmad[i].Destroy() 
     md = MyDialog(None, -1, 'New Game') 
     n = md.OnClose(None) 
     self.statusbar.SetStatusText('You Selected {} Pairs.'.format(n)) 
     self.Cards() 

    def OnButton(self, event): 
     print('ANYTHING PLEASE!') 

## problem ahead! 
    def Cards(self): 
     image = wx.Image('cveteki.jpg', wx.BITMAP_TYPE_ANY).ConvertToBitmap() 
     self.dugmad = [] 
     for i in range(2*n): 
      dugme = wx.BitmapButton(self, i, image) 
      self.dugmad.append(dugme) 
      self.Bind(wx.EVT_BUTTON, self.OnButton, id=i) 

     if n == 3: 
      self.Draw(2, 3) 
     if n == 4: 
      self.Draw(2, 4) 
     if n == 5: 
      self.Draw(2, 5) 

    def Draw(self,a, b):    
     gs = wx.GridSizer(a,b,40,40) 
     for i in range(n*2): 
      gs.Add(self.dugmad[i],0, wx.EXPAND) 

     vbox = wx.BoxSizer(wx.VERTICAL) 
     vbox.Add(gs, 1, wx.EXPAND | wx.ALL, 40) 
     self.SetSizer(vbox) 
     self.Layout() 
     self.Refresh() 
     global ControlVar 
     ControlVar=True 


    def OnKey(self, event): 
     keycode = event.GetKeyCode() 
     if keycode == wx.WXK_ESCAPE: 
      box = wx.MessageDialog(None, 'Are you sure you want to quit?', 'Quit', wx.YES_NO | wx.ICON_QUESTION) 
      if box.ShowModal() == wx.ID_YES: 
       self.Close() 

    def OnQuit(self, event): 
     box = wx.MessageDialog(None, 'Are you sure you want to quit?', 'Quit', wx.YES_NO | wx.ICON_QUESTION) 
     if box.ShowModal() == wx.ID_YES: 
      self.Destroy() 


class MyApp(wx.App): 
    def OnInit(self): 
     frame = MyMenu(None, -1, 'Memory') 
     frame.Show(True) 
     return (True) 

def main(): 
    app = MyApp(False) 
    app.MainLoop() 
main() 

回答

0

我试图运行你的代码,但我不会在准备与这些名字的图像,我可以不理解你所有的全局变量,并且我得到一个关于n没有定义的错误。所以我做了一个简单的测试,为你,我希望帮助:

import wx 
app = wx.App() 

def onButton(evt): 
    print "button pressed!", evt.GetEventObject().GetLabel() 

frm = wx.Frame(None) 

for i in range(10): 
    but = wx.Button(frm, pos=(10, i*20), label="button %s" % i) 
    but.Bind(wx.EVT_BUTTON, onButton) 

frm.Show() 
app.MainLoop() 

的but.Bind(...)也可能是frm.Bind(...)如果你真的想要。请注意,我没有与id的futz:我不在乎什么id的wxPython分配按钮。

我不确定你的代码有什么问题,因为我无法运行它,也不想用它来调试其他错误。

再次,我希望这有助于。

+0

谢谢。它会帮助我,希望。全球n是一个sintax警告,所以它也适用于此。 :) – caklovicka

+0

从菜单中选择File | New后,我得到一个NameError,而不是SyntaxWarning。在分配之前你已经提到了名字'n'。首先不知道'n'的用途,我停止了试图让你的脚本在我的机器上运行,并做了我提交的小测试。 –

0

但是你为什么在创建MyDialog后立即销毁?检查:在self.ShowModal()之后立即调用self.Destroy()方法。

+0

以及我不记得为什么。它不再存在,我删除了该行。 但我的朋友帮助我,并找出问题所在......每个我放的父母都是wx.Frame。这就是为什么它没有工作......他还纠正了我的其他错误,并解释了他们为什么错了。 – caklovicka

相关问题