2013-01-10 88 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

相關問題