2016-04-24 3 views
1

Dies ist:Wie ein Raster zu meinem Programm hinzufügen, ohne dass der Rest des Programms gelöscht wird? mein Code

import wx 
import wx.grid as gridlib 
from random import randint 

OPTIONS = [1, 2, 3, 4, 5, 6, 7, 8, 9, "DEL", 0, "SEND"] 
# these are the events' IDs sent to a function when you click a button. 
# the OPTIONS_ID is in the same order of OPTIONS. 

OPTIONS_ID = [-31990,-31989,-31988,-31987,-31986,-31985, -31984, -31983, -31982, -31981, -31980, -31979] # the built in wxpython IDs for the buttons 


GAME_POSITION = (400, 100) 
GAME_SIZE = [900, 600] 

class Frame(wx.Frame): # class for all the frames in our game. 

    def __init__(self, parent, id, title, pos, size): 
      wx.Frame.__init__(self, parent, id, title, pos, size) 
      self.panel = wx.Panel(self) 
      self.fdf = wx.TextCtrl(self.panel, size=(275, 75), pos=(520, 20)) 
      self.count = 0 




    # this function creates a textbox at a specific position with a specific size. 
    def write(self, panel, txt, pos, size=20, font_family=wx.SWISS, font_style = wx.NORMAL,font_weight = wx.BOLD, underline = False): 
     # create a textbox at a specific position with a specific size. 
     your_txt = wx.StaticText(panel, -1, txt, pos) 
     your_txt.SetFont(wx.Font(size,font_family,font_style,font_weight,underline)) 
    # same as above, just for a button. 
    def create_button(self, panel, txt, position, width, height): 
     Size = wx.Size(width, height) 
     self.button = wx.Button(panel, -1, txt, position, Size) 
     self.border = wx.BoxSizer(wx.VERTICAL) 
     self.border.Add(self.button) 
     self.Bind(wx.EVT_BUTTON, lambda evt: self.OnButton(evt), self.button) 
    def disable_button(self, panel, txt, position, width, height): 
     Size = wx.Size(width, height) 
     self.button = wx.Button(panel, -1, txt, position, Size) 
     self.border = wx.BoxSizer(wx.VERTICAL) 
     self.border.Add(self.button) 
     self.Bind(wx.EVT_BUTTON, lambda evt: self.OnButton(evt), self.button) 
     self.button.Disable() 
    def OnButton(self, event): 
     print repr(event.Id) + "," 
     if event.Id in OPTIONS_ID: # if indeed an option button was pressed 
      exited = -1 # exited is 5100 if the user exited his dialog box 
      # assigning the events to the button. 
      for i in range(12): 
       if event.Id != -31981 and event.Id != -31979 and event.Id == OPTIONS_ID[i]: 
        self.fdf.AppendText(str(OPTIONS[i])) 
        self.count += 1 
       elif event.Id == -31979: 
        pass 
      if event.Id == -31981: 
       if self.count > 0: 
        self.count -= 1 
       self.fdf.Remove(self.fdf.GetLastPosition()-1, self.fdf.GetLastPosition()) 
      if self.count == 4: 
       for child in self.panel.GetChildren(): 
        if isinstance(child, wx.Button): 
         try: 
          int(child.GetLabel()) 
         except ValueError: 
          if child.GetLabel() == "SEND": 
           child.Enable() 
         else: 
          child.Disable() 
      else: 
       for child in self.panel.GetChildren(): 
        if child.GetLabel() != "SEND": 
         child.Enable() 
        else: 
         child.Disable() 
        if self.count == 0: 
         if child.GetLabel() == "DEL": 
          child.Disable() 
      for child in self.panel.GetChildren(): 
       if isinstance(child, wx.Button): 
        if child.GetLabel() in self.fdf.GetValue(): 
         child.Disable() 



class Game(wx.App): 
    def OnInit(self): # upon game opening 
     # I would like the options window to be the first window's parent 
     # so I will first set up our options window: 
     window = Frame(None, -1, "Good Luck!", GAME_POSITION, GAME_SIZE) 
     first_panel = window.panel 

     window.write(first_panel, "BULLS AND COWS!", (20, 20), size=(35)) 
     countX = 500 
     countY = 100 
     for option in OPTIONS: 
      if str(option) == "SEND" or str(option) == "DEL": 
       window.disable_button(first_panel,str(option), (countX, countY), 100, 100) 
      else: 
       window.create_button(first_panel,str(option), (countX, countY), 100, 100) 
      countX += 110 
      if str(option) == "3" or str(option) == "6" or str(option) == "9": 
       countY += 110 
       countX = 500 



     window.Show(True) 
     return True 


def main(): 
    camel = Game() 
    camel.MainLoop() 


if __name__ == '__main__': 
    main() 

Was ich versuche, aus irgendeinem Grunde ist das Gitter in dem gesamten Rahmen gezeigt, zu tun ist, ein Gitter in den leeren Bereich hinzufügen, aber die die die anderen Attribute verstecken das Panel. Meine Frage ist, wie man das Gitter normalerweise zum Panel hinzufügt, ich meine, ohne das andere Programm zu ruinieren? Ich habe versucht, mit der Position zu spielen, aber aus irgendeinem Grund funktioniert es nicht, und ich habe keine Informationen im Internet gefunden. Ich werde froh sein, hier etwas Hilfe zu bekommen. Danke (: By the way: das Raster mit 10 Zeilen und 3 Spalten

+0

Es ist nicht sehr klar für mich, was du beschreibst, wie dein Frame aussehen soll, ich sehe kein 10-Zeilen-3-Spalten-Raster Zahleneingabe-Panel und Sie haben getan Import wx.grid als gridlib aber nicht den Import überall verwendet? – Yoriz

+0

Ich möchte, dass mein Rahmen wie der Code oben ist, und ein Gitter zusätzlich auf der linken Seite (der leeren Seite) des Rahmens. Das Problem ist, dass ich nicht weiß, wie man ein Gitter erstellt, das in dieser Position sein wird - als ich versuchte, das Gitter zu bauen, füllte es den ganzen Rahmen und nicht nur die linke Seite. verstehst du? – omer

+0

Ich habe gerade das Gitter importiert, aber habe es noch nicht benutzt (da ich nicht weiß wie). – omer

Antwort

0

Wenn ich Sie richtig verstanden habe sollte es so funktionieren:.

class Game(wx.App): 
    def OnInit(self): # upon game opening 
     # I would like the options window to be the first window's parent 
     # so I will first set up our options window: 
     window = Frame(None, -1, "Good Luck!", GAME_POSITION, GAME_SIZE) 
     first_panel = window.panel 

     #This lines of code add the grid to the frame 
     grid = gridlib.Grid(first_panel) #the grid must created with a panel as argument 
     grid.CreateGrid(10,3) #create grid with 10 rows and 3 columns 
     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     sizer.Add(grid, 0, wx.ALIGN_CENTER|wx.ALL, 50) #Border in all directions with 50 pixels width 
     first_panel.SetSizer(sizer) 
     #grid has been added to the frame... continuing with your code   

     window.write(first_panel, "BULLS AND COWS!", (20, 20), size=(35)) 
     countX = 500 
     countY = 100 
... 

Sie auch das Video! Gitter in einer Funktion Ihrer Frame-Klasse sollte es ähnlich arbeiten und hängt von Ihrer Anwendung ab Ich denke, dass der Erfolg des Hinzufügens eines Rasters, ohne den Rest Ihres Rahmens "zu zerstören" hängt vom Sizer. Mit den obigen Argumenten sollte es funktionieren.

+0

Ich habe das schon gemacht .. aber danke trotzdem :)! – omer

Verwandte Themen