2017-06-01 2 views
0

Ich mache eine GUI des Periodensystems der Elemente mit wxpython, ich habe alle Schaltflächen hinzugefügt. So, was ich will, ist, wenn der Benutzer mehrere Tasten auswählt, sollte es mir die gleiche Ausgabe geben wie die auf der Schaltfläche beschriftet. Versuchen Sie, diesen Code auszuführen, aber den Fehler zu erhalten. Ich weiß nicht was falsch ist, ich mache hier.wxpython: 'Beispiel' Objekt hat kein Attribut 'OnClick'

import wx 


class Example(wx.Frame): 
    def __init__(self, parent, title): 
     super(Example, self).__init__(parent, title=title, size=(1000, 800)) 

     self.InitUI() 
     self.Centre() 
     self.Show() 

    def InitUI(self): 
     p = wx.Panel(self) 

     gs = wx.GridSizer(11, 18, 5, 1) 

     A = ["H", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "He", "Li", "Be", " ", 
      " ", 
      " ", " ", " ", " ", " ", " ", " ", " ", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", " ", " ", " ", " ", " ", 
      " ", 
      " ", " ", " ", " ", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", 
      "Ni", 
      "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", 
      "Ag", 
      "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", 
      "Hg", "Tl", 
      "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", 
      "Fl", 
      "Mc", "Lv", "Ts", "Og", 
      " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", 
      "La", 
      "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", " ", " ", " ", "Ac", 
      "Th", 
      "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr", " ", " ", " ", " ", " ", " ", 
      " ", 
      " ", " ", "Go", " ", " ", " ", " ", " ", " ", " ", " "] 
     for i in A: 
      btn = str(i) 
     a = wx.Button(self, 10, "str(i)", (20, 20)) # buttons are added 
     a.myname = "str(i)" 
     self.Bind(wx.EVT_BUTTON, self.OnClick, a) 
     print(i) 

    def OnClick(self, event): # When the button is clicked 
     name = event.GetEventObject().myname 

     p.SetSizer(gs) 

app = wx.App() 
Example(None, title='Grid demo') 
app.MainLoop() 
+0

Ich würde annehmen, dass Ihr Einzug falsch ist - stellen Sie sicher, dass OnClick richtig eingerückt ist – user2682863

+0

Yup! Habe es korrigiert. –

Antwort

0

Nun, es scheint, dass das dritte Argument in self.Bind(wx.EVT_BUTTON, self.OnClick, a) nutzlos ist, versuchen self.Bind(wx.EVT_BUTTON, self.OnClick)

(mit Code-Vergleich dank wxformbuilder generiert)

0

Es ist alles ein bisschen eng die Anzahl der Tasten gegeben und Sie müssen die Schaltflächen als Teil des Panels deklarieren und nicht hoffen, dass der Sizer die Arbeit für Sie erledigt.
Es gibt wenige Änderungen, aber sie sind wichtig.

Code enthält jetzt Elemente {Wörterbuch} für Elementanzeige (Ich vermisse einige der selteneren Elemente wie Oganesson, aber hey, wenn Sie es nicht essen können, rauchen Sie, machen Sie einen Kauf damit oder verwenden Sie es, um zu skalieren ein berg, der sich interessiert?)

import wx 
class Example(wx.Frame): 

    def __init__(self, parent, title): 
     super(Example, self).__init__(parent, title = title,size = (2000,1000)) 

     self.InitUI() 
     self.Layout() 
     self.Centre() 
     self.Show() 

    def InitUI(self): 
     self.elements = {'Ru': 'Ruthenium', 'Re': 'Rhenium', 'Rf': 'Rutherfordium', 'Rg': 'Roentgenium', 'Ra': 'Radium', 'Rb': 'Rubidium', 'Rn': 'Radon', 'Rh': 'Rhodium', 'Be': 'Beryllium', 'Ba': 'Barium', 'Bh': 'Bohrium', 'Bi': 'Bismuth', 'Bk': 'Berkelium', 'Br': 'Bromine', 'H': 'Hydrogen', 'P': 'Phosphorus', 'Os': 'Osmium', 'Es': 'Einsteinium', 'Hg': 'Mercury', 'Ge': 'Germanium', 'Gd': 'Gadolinium', 'Ga': 'Gallium', 'Pr': 'Praseodymium', 'Pt': 'Platinum', 'Pu': 'Plutonium', 'C': 'Carbon', 'Pb': 'Lead', 'Pa': 'Protactinium', 'Pd': 'Palladium', 'Cd': 'Cadmium', 'Po': 'Polonium', 'Pm': 'Promethium', 'Hs': 'Hassium', 'Uup': 'Ununpentium', 'Uus': 'Ununseptium', 'Uuo': 'Ununoctium', 'Ho': 'Holmium', 'Hf': 'Hafnium', 'K': 'Potassium', 'He': 'Helium', 'Md': 'Mendelevium', 'Mg': 'Magnesium', 'Mo': 'Molybdenum', 'Mn': 'Manganese', 'O': 'Oxygen', 'Mt': 'Meitnerium', 'S': 'Sulfur', 'W': 'Tungsten', 'Zn': 'Zinc', 'Eu': 'Europium', 'Zr': 'Zirconium', 'Er': 'Erbium', 'Ni': 'Nickel', 'No': 'Nobelium', 'Na': 'Sodium', 'Nb': 'Niobium', 'Nd': 'Neodymium', 'Ne': 'Neon', 'Np': 'Neptunium', 'Fr': 'Francium', 'Fe': 'Iron', 'Fl': 'Flerovium', 'Fm': 'Fermium', 'B': 'Boron', 'F': 'Fluorine', 'Sr': 'Strontium', 'N': 'Nitrogen', 'Kr': 'Krypton', 'Si': 'Silicon', 'Sn': 'Tin', 'Sm': 'Samarium', 'V': 'Vanadium', 'Sc': 'Scandium', 'Sb': 'Antimony', 'Sg': 'Seaborgium', 'Se': 'Selenium', 'Co': 'Cobalt', 'Cn': 'Copernicium', 'Cm': 'Curium', 'Cl': 'Chlorine', 'Ca': 'Calcium', 'Cf': 'Californium', 'Ce': 'Cerium', 'Xe': 'Xenon', 'Lu': 'Lutetium', 'Cs': 'Caesium', 'Cr': 'Chromium', 'Cu': 'Copper', 'La': 'Lanthanum', 'Li': 'Lithium', 'Lv': 'Livermorium', 'Tl': 'Thallium', 'Tm': 'Thulium', 'Lr': 'Lawrencium', 'Th': 'Thorium', 'Ti': 'Titanium', 'Te': 'Tellurium', 'Tb': 'Terbium', 'Tc': 'Technetium', 'Ta': 'Tantalum', 'Yb': 'Ytterbium', 'Db': 'Dubnium', 'Dy': 'Dysprosium', 'Ds': 'Darmstadtium', 'I': 'Iodine', 'U': 'Uranium', 'Y': 'Yttrium', 'Ac': 'Actinium', 'Ag': 'Silver', 'Uut': 'Ununtrium', 'Ir': 'Iridium', 'Am': 'Americium', 'Al': 'Aluminium', 'As': 'Arsenic', 'Ar': 'Argon', 'Au': 'Gold', 'At': 'Astatine', 'In': 'Indium'} 
     p = wx.Panel(self) 
     gs = wx.GridSizer(11, 18, 5, 5) 
     A = [ "H"," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ", "He", "Li", "Be"," "," "," "," "," "," "," "," "," "," ", "B" , "C", "N", "O", "F" , "Ne", "Na", "Mg"," "," "," "," "," "," "," "," "," "," ", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca","Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru","Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "" , "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "", "Rf", "Db", "Sg", "Bh", "Hs","Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og"," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ", " ", " "," ", " ", " ", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm","Yb", "Lu"," ", " ", " ","Ac", "Th" , "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk","Cf", "Es", "Fm", "Md" , "No", "Lr"," "," "," "," "," "," "," "," "," " ,"Go"," "," "," "," "," "," "," ","ZZ" ] 
     for i in A: 
      btn = wx.Button(p, -1, i, (10,20)) #buttons are added 
      btn.myname = i 
      gs.Add(btn,0,) 
      self.Bind(wx.EVT_BUTTON, self.OnClick, btn) 
     p.SetSizer(gs) 

    def OnClick(self, event): #When the button is clicked 
     name = event.GetEventObject().myname 
     try: 
      element = self.elements[name] 
      wx.MessageBox("You selected element "+element, "Selection",wx.ICON_INFORMATION | wx.OK) 
     except: 
      wx.MessageBox("You selected element "+name, "Selection",wx.ICON_INFORMATION | wx.OK) 

app = wx.App() 
Example(None, title = 'Grid demo') 
app.MainLoop() 

Neue Version basiert auf Ihre andere Frage Error with on click event in wxpython

import wx 
class Example(wx.Frame): 

    def __init__(self, parent, title): 
     super(Example, self).__init__(parent, title = title,size = (1400,500)) 
     self.InitUI() 
     self.Layout() 
     self.Centre() 
     self.Show() 

    def InitUI(self): 
     self.elements = {'Ru': 'Ruthenium', 'Re': 'Rhenium', 'Rf': 'Rutherfordium', 'Rg': 'Roentgenium', 'Ra': 'Radium', 'Rb': 'Rubidium', 'Rn': 'Radon', 'Rh': 'Rhodium', 'Be': 'Beryllium', 'Ba': 'Barium', 'Bh': 'Bohrium', 'Bi': 'Bismuth', 'Bk': 'Berkelium', 'Br': 'Bromine', 'H': 'Hydrogen', 'P': 'Phosphorus', 'Os': 'Osmium', 'Es': 'Einsteinium', 'Hg': 'Mercury', 'Ge': 'Germanium', 'Gd': 'Gadolinium', 'Ga': 'Gallium', 'Pr': 'Praseodymium', 'Pt': 'Platinum', 'Pu': 'Plutonium', 'C': 'Carbon', 'Pb': 'Lead', 'Pa': 'Protactinium', 'Pd': 'Palladium', 'Cd': 'Cadmium', 'Po': 'Polonium', 'Pm': 'Promethium', 'Hs': 'Hassium', 'Uup': 'Ununpentium', 'Uus': 'Ununseptium', 'Uuo': 'Ununoctium', 'Ho': 'Holmium', 'Hf': 'Hafnium', 'K': 'Potassium', 'He': 'Helium', 'Md': 'Mendelevium', 'Mg': 'Magnesium', 'Mo': 'Molybdenum', 'Mn': 'Manganese', 'O': 'Oxygen', 'Mt': 'Meitnerium', 'S': 'Sulfur', 'W': 'Tungsten', 'Zn': 'Zinc', 'Eu': 'Europium', 'Zr': 'Zirconium', 'Er': 'Erbium', 'Ni': 'Nickel', 'No': 'Nobelium', 'Na': 'Sodium', 'Nb': 'Niobium', 'Nd': 'Neodymium', 'Ne': 'Neon', 'Np': 'Neptunium', 'Fr': 'Francium', 'Fe': 'Iron', 'Fl': 'Flerovium', 'Fm': 'Fermium', 'B': 'Boron', 'F': 'Fluorine', 'Sr': 'Strontium', 'N': 'Nitrogen', 'Kr': 'Krypton', 'Si': 'Silicon', 'Sn': 'Tin', 'Sm': 'Samarium', 'V': 'Vanadium', 'Sc': 'Scandium', 'Sb': 'Antimony', 'Sg': 'Seaborgium', 'Se': 'Selenium', 'Co': 'Cobalt', 'Cn': 'Copernicium', 'Cm': 'Curium', 'Cl': 'Chlorine', 'Ca': 'Calcium', 'Cf': 'Californium', 'Ce': 'Cerium', 'Xe': 'Xenon', 'Lu': 'Lutetium', 'Cs': 'Caesium', 'Cr': 'Chromium', 'Cu': 'Copper', 'La': 'Lanthanum', 'Li': 'Lithium', 'Lv': 'Livermorium', 'Tl': 'Thallium', 'Tm': 'Thulium', 'Lr': 'Lawrencium', 'Th': 'Thorium', 'Ti': 'Titanium', 'Te': 'Tellurium', 'Tb': 'Terbium', 'Tc': 'Technetium', 'Ta': 'Tantalum', 'Yb': 'Ytterbium', 'Db': 'Dubnium', 'Dy': 'Dysprosium', 'Ds': 'Darmstadtium', 'I': 'Iodine', 'U': 'Uranium', 'Y': 'Yttrium', 'Ac': 'Actinium', 'Ag': 'Silver', 'Uut': 'Ununtrium', 'Ir': 'Iridium', 'Am': 'Americium', 'Al': 'Aluminium', 'As': 'Arsenic', 'Ar': 'Argon', 'Au': 'Gold', 'At': 'Astatine', 'In': 'Indium'} 
     p = wx.Panel(self) 
     hbox1= wx.BoxSizer(wx.VERTICAL) 
     self.t1= wx.TextCtrl (p,0,value="",size=(120,30),style=wx.TE_READONLY) 
     hbox1.Add(self.t1,proportion=0,flag=wx.CENTER) 
     gs = wx.GridSizer(11, 18, 5, 5) 
     A = [ "H"," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ", "He", "Li", "Be"," "," "," "," "," "," "," "," "," "," ", "B" , "C", "N", "O", "F" , "Ne", "Na", "Mg"," "," "," "," "," "," "," "," "," "," ", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca","Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru","Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "" , "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "", "Rf", "Db", "Sg", "Bh", "Hs","Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og"," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ", " ", " "," ", " ", " ", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm","Yb", "Lu"," ", " ", " ","Ac", "Th" , "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk","Cf", "Es", "Fm", "Md" , "No", "Lr"," "," "," "," "," "," "," "," "," " ," "," "," "," "," "," "," "," "," "] 
     for element in A: 
      btn = wx.Button(p, -1, element, (10,20)) #buttons are added 
      btn.name = element 
      gs.Add(btn,0,) 
      self.Bind(wx.EVT_BUTTON, self.OnClick, btn) 
     hbox1.Add(gs,proportion=0) 
     p.SetSizer(hbox1) 

    def OnClick(self, event): #When the button is clicked 
     name = event.GetEventObject().name 
     try: 
      element = self.elements[name] 
     except: 
      element = name 
     self.t1.SetValue(element) 

app = wx.App() 
Example(None, title = 'Element Grid') 
app.MainLoop() 

das ist jetzt das dritte Mal, dass ich Sie gebeten haben, zu lesen, wie Stackoverflow funktioniert, lesen Sie bitte die Tour Seiten. Letztendlich ist dies zu deinem Besten.

+0

Danke, Alter! Es funktionierte für mich –

+0

, wenn ich auf einen Knopf klicke, druckt es im Terminal anstelle des Panels, kannst du mir bitte vorschlagen, wie ich das angeklickte Knopfaufkleber dort auf dem Panel bekommen kann. Es tut mir leid, sehr neu für Python. –

+0

Das ist, was 'print name' Ihnen bringt. Sehen Sie sich die bearbeitete Antwort an. Es ist eine Messagebox, da der Bildschirm bereits mit dem Elementraster belegt ist. –

Verwandte Themen