如何使用触摸屏为tkinter中的函数调用选择特定的输入部件?

2024-06-08 17:40:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个触摸屏图形用户界面,它有多个输入小部件,可以使用小键盘进行编辑。我如何知道用户选择了哪个条目小部件?我已经创建了一个迂回的方式,每个条目都被编码为一个按钮,当点击时,按钮编辑一个‘选定’变量,小键盘使用这个变量来知道要编辑哪个,但是有更好的方法吗?可能用焦点?(我有按钮小部件工作,但我想使用评论条目小部件,而且一些不相关的代码已经被删除,所以帖子不会太长)

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

Tags: lambdatextselfcolumnbuttonwidthcommandgrid
1条回答
网友
1楼 · 发布于 2024-06-08 17:40:16

我想如果你有一个传统的鼠标和键盘,它的工作原理会完全相同。当用户触摸一个条目小部件时,该小部件将获得焦点。您的函数只需将文本输入到具有焦点的小部件中。这正是“焦点”概念存在的问题。在

删除您的按钮,将条目小部件放回原处,并将setCode改为:

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

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

您可能还需要关注第一个条目小部件。为此,您需要保留对它的引用(最佳做法是将小部件的创建与使用gridpack或{}将其添加到窗口中是一种最佳做法,即使您不需要引用):

^{pr2}$

相关问题 更多 >