2017-06-01 2 views
0

Je crée une interface graphique de la table périodique des éléments avec wxpython, j'ai ajouté tous les boutons. Donc maintenant ce que je veux, c'est que lorsque l'utilisateur sélectionne plusieurs boutons, il devrait me donner la même sortie que l'étiquette sur le bouton. Essayer d'exécuter ce code mais obtenir l'erreur. Je ne sais pas ce qui ne va pas, je fais ici.wxpython: l'objet 'Exemple' n'a pas d'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

Je suppose que votre indentation est fausse - assurez-vous que OnClick est correctement indenté – user2682863

+0

Yup! Je l'ai corrigé. –

Répondre

0

Eh bien, il semble que le troisième argument self.Bind(wx.EVT_BUTTON, self.OnClick, a) ne sert à rien, essayez self.Bind(wx.EVT_BUTTON, self.OnClick)

(comparaison avec le code généré grâce à wxFormBuilder)

0

Il est tout un peu serré étant donné le nombre de boutons et vous devez déclarer les boutons dans le cadre du panneau, sans espérer que le calibreur fera le travail pour vous.
Il y a peu de changements mais ils sont importants. Le code inclut maintenant des éléments {dictionnaire} pour l'affichage d'élément (il me manque quelques-uns des éléments plus rares comme Oganesson mais bon si vous ne pouvez pas le manger, le fumez, faites un achat avec lui ou l'employez pour redimensionner une montagne, qui se soucie?)

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() 

Nouvelle version en fonction de votre autre question 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() 

Ceci est maintenant la troisième fois que je vous ai demandé de lire comment fonctionne StackOverflow, s'il vous plaît lire la tournée pages En fin de compte, c'est pour votre propre bien.

+0

Merci mec! Cela a fonctionné pour moi –

+0

quand je clique sur un bouton il imprime dans le terminal au lieu du panneau, pouvez-vous s'il vous plaît me suggérer comment je peux obtenir l'étiquette de bouton cliquée là-bas sur le panneau. Je suis désolé très nouveau pour python. –

+0

C'est ce que 'print name' vous donnera. Jetez un oeil à la réponse éditée. C'est un messagebox car l'écran est déjà pris avec la grille de l'élément. –