2017-09-13 3 views
0

私はキーパッドを使って編集された複数の入力ウィジェットを持つタッチスクリーンGUIを作成しています。ユーザーが選択したエントリウィジェットを知るにはどうすればよいですか?私は、各エントリがボタンとしてコード化されているラウンドアバウトの方法を作りました。そして、クリックすると、ボタンは、選択された変数を編集し、キーパッドは編集するものを知るために使用しますが、より良い方法はありますか?おそらくフォーカスを使用していますか? (私が働いて、ボタンのウィジェットを持っているが、私はポストが過度に長くはなかったので、また、いくつかの無関係なコードが削除されたコメントのエントリウィジェット、使用したい)私はそれがあればあるまったく同じに働くだろうと想像タッチスクリーンを使用してtkinterの関数呼び出しに特定のエントリウィジェットを選択する方法は?

class MyApp(Tk): 
    def __init__(self,*args, **kwargs): 
     Tk.__init__(self, *args, **kwargs) 

     container = Frame(self) 
     container.pack(side="top", fill="both", expand = True) 

     self.shared_data = { 
      'codeOne' : StringVar(), 
      'codeTwo' : StringVar(), 
      'selectedCode' : StringVar(), 
     } 

    def setCode(self, value): 
     #function updates selected variable 
     selectedVar = self.shared_data['selectedCode'] 
     if selectedVar.get() == 'codeOne': 
      code = self.shared_data['codeOne'] 
     elif selectedVar.get() == 'codeTwo': 
      code = self.shared_data['codeTwo'] 
     else: #non selected 
      print('nothing selected') 
      return False 
     old = code.get() 
     if type(value) == int: 
      code.set(old+str(value)) 
     else: 
      code.set(old[0:len(old)-1]) 
     return True 

    def setVariable(self, variable, value): 
     variable.set(value) 
     return True 

class MenuPage(Frame): 
    def __init__(self, parent, controller): 
     Frame.__init__(self, parent) 
     self.controller = controller 

     Label(self, text="Code 1:", font='Helvetica 15').grid(row=2, column=0, columnspan=3, sticky=E, pady=10) 
     Button(self, textvariable=controller.shared_data['codeOne'], font=MENU_ENTRIES, width=7, bg='grey99', command=lambda:controller.setVariable(controller.shared_data['selectedCode'],'codeOne')).grid(row=2, column=1, pady=10) 
     #Entry(self, textvariable=controller.shared_data['codeOne'], font='Helvetica 15').grid(row=2, column=3, columnspan=1, pady=10, sticky=W) 

     Label(self, text="Code 2:", font='Helvetica 15').grid(row=3, column=0, columnspan=3, sticky=E, pady=10) 
     Button(self, textvariable=controller.shared_data['codeTwo'], font=MENU_ENTRIES, width=7, bg='grey99', command=lambda:controller.setVariable(controller.shared_data['selectedCode'],'codeTwo')).grid(row=2, column=1, pady=10) 
     #Entry(self, textvariable=controller.shared_data['codeTwo'], font='Helvetica 15').grid(row=3, column=3, columnspan=3, pady=10, sticky=W) 

     Button(self, text="1", width=3, command=lambda:controller.setCode(1)).grid(row=1, column=3, rowspan=2, padx=(20,5), pady=10) 
     Button(self, text="2", width=3, command=lambda:controller.setCode(2)).grid(row=1, column=4, rowspan=2, padx=5, pady=10) 
     Button(self, text="3", width=3, command=lambda:controller.setCode(3)).grid(row=1, column=5, rowspan=2, padx=5, pady=10) 
     Button(self, text="4", width=3, command=lambda:controller.setCode(4)).grid(row=3, column=3, rowspan=2, padx=(20,5), pady=10) 
     Button(self, text="5", width=3, command=lambda:controller.setCode(5)).grid(row=3, column=4, rowspan=2, padx=5, pady=10) 
     Button(self, text="6", width=3, command=lambda:controller.setCode(6)).grid(row=3, column=5, rowspan=2, padx=5, pady=10) 
     Button(self, text="7", width=3, command=lambda:controller.setCode(7)).grid(row=5, column=3, rowspan=2, padx=(20,5), pady=10) 
     Button(self, text="8", width=3, command=lambda:controller.setCode(8)).grid(row=5, column=4, rowspan=2, padx=5, pady=10) 
     Button(self, text="9", width=3, command=lambda:controller.setCode(9)).grid(row=5, column=5, rowspan=2, padx=5, pady=10) 
     Button(self, text="DELETE", width=7, command=lambda:controller.setCode('delete')).grid(row=7, column=3, rowspan=2, columnspan=2, padx=(20,5), pady=10) 
     Button(self, text="0", width=3, command=lambda:controller.setCode(0)).grid(row=7, column=5, rowspan=2, padx=5, pady=10) 

app = MyApp() 
app.mainloop() 

答えて

0

をあなたは伝統的なマウスとキーボードを持っていました。ユーザがエントリウィジェットに触れると、そのウィジェットがフォーカスを取得します。あなたの関数はフォーカスを持ってウィジェットにテキストを入力するだけです。これはちょうど「焦点」の概念が存在する問題の種類です。

は、あなたのボタンを削除し、あなたのエントリが戻っウィジェット入れて、このようにsetCodeを変更:

def setCode(self, value): 
    # get the widget with the focus 
    widget = self.focus_get() 

    # insert the value 
    widget.insert("insert", value) 

ます。また、最初のエントリウィジェットにフォーカスを与えたいと思うかもしれません。

entry = Entry(self, textvariable=controller.shared_data['codeOne'], width=7, bg='grey99') 
entry.grid(row=2, column=1, pady=10) 
entry.focus_set() 
:あなたは(それはあなたが参照を必要としない場合でも gridpackまたは placeとウィンドウに追加のウィジェットの作成を分離するためのベストプラクティスです)、それへの参照を保持する必要があることを行うために、
+0

ありがとう!削除キーが押されたときに挿入機能を編集する必要がありますが、それ以外は機能します! –

関連する問題