2017-06-01 5 views
0

私はwxpythonで要素の周期表のGUIを作成していますが、すべてのボタンを追加しました。だから、今私が望むのは、ユーザーが複数のボタンを選択したときに、ボタンのラベルと同じ出力を出す必要がある場合です。このコードを実行しようとしましたが、エラーが発生しました。何が間違っているのか分からない、私はここでやっている。wxpython: 'Example'オブジェクトに '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

あなたのインデントが間違っていると思われます.OnClickが正しくインデントされていることを確認してください。 – user2682863

+0

Yup!それを修正しました。 –

答えて

0

まあ、self.Bind(wx.EVT_BUTTON, self.OnClick)

を試し、self.Bind(wx.EVT_BUTTON, self.OnClick, a)で3番目の引数は無用であると思われる(コードと比較wxformbuilderのおかげで生成される)

0

これは、すべてのビットタイトなボタンの数を与えられていますし、あなたはパネルの一部としてボタンを宣言しなければならず、サイザーがあなたのために仕事をすることを望んではいけません。
変更はほとんどありませんが、重要です。

コードには要素表示用の要素{dictionary}が含まれています(Oganessonのような希少要素のいくつかが欠落していますが、食べられない、喫煙できない、あなたの他の質問に基づいて気に山、?)

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

新バージョンが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() 

これは私がStackOverflowのがどのように機能するかを読むためにあなたを求めている三回目は今、ツアーをお読みくださいページ。最終的には、これはあなた自身のためのものです。

+0

ありがとう!それは私のために働いた –

+0

ボタンをクリックすると、パネルではなく端末で印刷されます。どうすればパネル上にクリックされたボタンのラベルが表示されるのですか?私は非常にPythonにはごめんなさい申し訳ありません。 –

+0

これは 'print name'があなたに与えるものです。編集された答えを見てください。画面がすでに要素グリッドで取り込まれているので、メッセージボックスです。 –

関連する問題