如何返回Tkinter中当前关注的Entry的长度? (以Backspace为重点的条目)

时间:2019-05-25 13:27:59

标签: python python-3.x tkinter

我正在尝试为GUI创建一个退格按钮,目前我有一个绑定到一个按钮的Clear效果,但是当必须重新输入整个字符串而犯了一个错误时,它会很烦人。

我尝试了几种Entry.focus_get(self)的重排,尝试从len内部调用,即len(Entry.focus_get(self)-1,END)。

    from tkinter import *
    from datetime import datetime
    import time
    from time import sleep
    import csv
    import tkinter

    class LabeledCheckbutton(Frame):
        def __init__(self, root):
            Frame.__init__(self, root)
            self.checkbutton = Checkbutton(self)
            self.label = Label(self)
            self.label.grid(row=0, column=0, sticky=W)
            self.checkbutton.grid(row=0, column=1, sticky=E)

    class Clock(Frame):
        def __init__(self, root):
            Frame.__init__(self, root)
            clock_frame = Label(self)
            clock_frame['text'] = '19:12:09'
            clock_frame.grid(row=0, column=0)
            def tic():
             clock_frame['text'] = datetime.now().strftime("%d %B %Y %I:%M:%S %p")

            def tac():
             tic()
             clock_frame.after(1, tac)
            tac()  


    class SampleApp(Tk):
        def __init__(self):
            Tk.__init__(self)
            self._frame = None
            self.switch_frame(AddMethod)

        def switch_frame(self, frame_class):
            """Destroys current frame and replaces it with a new one."""
            #camera.stop_preview()
            new_frame = frame_class(self)
            if self._frame is not None:
                self._frame.destroy()
            self._frame = new_frame
            self._frame.grid(row=0, column=0)

    class AddMethod(Frame):
        def __init__(self, master):
            Frame.__init__(self, master)

            title = Label(self, text="Method Settings").grid(row=0, column=1)
            clock  = Clock(self).grid(row=0, column=2, columnspan=2)

            a1 = Button(self, text='Back', height=5, width=20, command=lambda: master.switch_frame(ManMeth)).grid(row=1, rowspan=2, column=0, sticky='')
            a2 = Button(self, text='Save and Return to Analysis', height=5, width=20, command=lambda: master.switch_frame(ManMeth)).grid(row=3, rowspan=2, column=0, sticky='')
            a3 = Button(self, text='Save Method', height=5, width=20, command=self.writeToFile).grid(row=5, column=0, sticky='')

            mthtit = Label(self, text="Method Title", font="Verdana 20").grid(row=2, column=1, sticky=W)
            sttemp = Label(self, text="Start Temperature", font="Verdana 20").grid(row=3, column=1, sticky=W)
            wttm = Label(self, text="Waiting Time", font="Verdana 20").grid(row=4, column=1, sticky=W)
            sktm = Label(self, text="Soaking Time", font="Verdana 20").grid(row=5, column=1, sticky=W)
            endtemp = Label(self, text="End Temperature", font="Verdana 20").grid(row=6, column=1, sticky=W)
            htrt = Label(self, text="Heating Rate", font="Verdana 20").grid(row=7, column=1, sticky=W)
            self.labeledcb = LabeledCheckbutton(self)
            self.labeledcb.label.configure(text="Ramp to Starting Temperature", font="Verdana 20")
            self.labeledcb.grid(row=1, column=1, sticky=W, padx=10, pady=10)

            self.mthtite = Entry(self, relief=SUNKEN, bd=5)
            self.mthtite.grid(row=2, column=2, padx=10, pady=10)
            self.sttempe = Entry(self, relief=SUNKEN, bd=5)
            self.sttempe.grid(row=3, column=2, padx=10, pady=10)
            self.wttme = Entry(self, relief=SUNKEN, bd=5)
            self.wttme.grid(row=4, column=2, padx=10, pady=10)
            self.sktme = Entry(self, relief=SUNKEN, bd=5)
            self.sktme.grid(row=5, column=2, padx=10, pady=10)
            self.endtempe = Entry(self, relief=SUNKEN, bd=5)
            self.endtempe.grid(row=6, column=2, padx=10, pady=10)
            self.htrte = Entry(self, relief=SUNKEN, bd=5)
            self.htrte.grid(row=7, column=2, padx=10, pady=10)

            sttemp1 = Label(self, text="°C", font="Verdana 20").grid(row=3, column=3, sticky=W)
            wttm1 = Label(self, text="Sec", font="Verdana 20").grid(row=4, column=3, sticky=W)
            sktm1 = Label(self, text="MM:SS", font="Verdana 20").grid(row=5, column=3, sticky=W)
            endtemp1 = Label(self, text="°C", font="Verdana 20").grid(row=6, column=3, sticky=W)
            htrt1 = Label(self, text="°C/Min", font="Verdana 20").grid(row=7, column=3, sticky=W)

            buttons = [
            '~','`','!','@','#','$','%','^','&','*','(',')','-','_'         ,'Clear',
            'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P','\\','7','8','9','Back',
            'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L','[',']','4','5','6','Tab',
            'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.','?','/','1','2','3','Space',
            ]
            #entry = Entry.focus_get(self)
            #def length():
                #ln = Entry.focus_get(self).get
                #length = (len(ln)-1)

            widget = self.focus_get()
            if widget:
                widget.delete(widget.index("end")-1)
           ####################     
            def select(value):
                if value =="Clear":
                    Entry.focus_get(self).delete(0, END)
                elif value == "Back":
                    Entry.focus_get(self).delete(widget)
                elif value == "Space":
                    Entry.focus_get(self).insert(END, ' ')
                elif value == " Tab ":
                    Entry.focus_get(self).insert(END, '    ')
                else :
                    Entry.focus_get(self).insert(END, value)
                 ######################           
            class Keyboard(Frame):
                def __init__(self, root):
                    Frame.__init__(self, root)

                    def HosoPop():

                            varRow = 2
                            varColumn = 0

                            for button in buttons:

                                    command = lambda x=button: select(x)

                                    if button == "Clear" or button == "Back" or button == "Tab" or button == "Space":
                                            Button(self,text= button,width=9, height=3, bg="grey", fg="black",
                                                    activebackground = "#ffffff", activeforeground="#3c4987", padx=2,
                                                   command=command).grid(row=varRow,column=varColumn)

                                    else:
                                            Button(self,text= button,width=8, height=3, bg="grey", fg="black",
                                                    activebackground = "#ffffff", activeforeground="#3c4987",
                                                   command=command).grid(row=varRow,column=varColumn)


                                    varColumn +=1 

                                    if varColumn > 14 and varRow == 2:
                                            varColumn = 0
                                            varRow+=1
                                    if varColumn > 14 and varRow == 3:
                                            varColumn = 0
                                            varRow+=1
                                    if varColumn > 14 and varRow == 4:
                                            varColumn = 0
                                            varRow+=1
                    HosoPop()

            #btmfrm = Frame(self, height=200, width=800, bd=1, relief=SUNKEN).grid(row=8, columnspan=3)
            keys  = Keyboard(self).grid(row=8, column=1, columnspan=2)
            #keys = KeyboardEntry(self).grid(row=8, column=1, columnspan=2)


        def writeToFile(self):
            with open('Working_MethodFile.csv', 'a') as f:
                w=csv.writer(f, quoting=csv.QUOTE_ALL)
                w.writerow([self.mthtite.get(), self.sttempe.get(), self.wttme.get(), self.sktme.get(), self.endtempe.get(), self.htrte.get()])


    if __name__ == "__main__":
        app = SampleApp()
        app.mainloop()

我希望该按钮从当前关注的文本条目中删除最后一个字符,类似于clear会从当前关注的文本条目中删除所有文本。

2 个答案:

答案 0 :(得分:1)

您可以使用根窗口的focus_get方法来确定哪个小部件具有键盘焦点。

您可以使用index方法来获取最后一个字符的索引。要删除该字符,请从索引中减去一个并将其传递给delete方法:

widget = root.focus_get()
if widget:
    widget.delete(widget.index("end")-1)

这是一个完整的工作示例:

import tkinter as tk

def do_delete():
    widget = root.focus_get()
    if widget:
        widget.delete(widget.index("end")-1)

root = tk.Tk()
for i in range(5):
    entry = tk.Entry(root)
    entry.pack(side="top", fill="x")

button = tk.Button(root, text="Delete last char", command=do_delete)
button.pack(side="bottom", expand=True)

root.mainloop()

答案 1 :(得分:0)

我最终只需要将您的代码添加到“返回”按钮命令中,如下所示;

    def select(value):
        if value =="Clear":
            Entry.focus_get(self).delete(0, END)
        elif value == "Back":

            widget = Entry.focus_get(self)
            if widget:
                widget.delete(widget.index("end")-1)

        elif value == "Space":
            Entry.focus_get(self).insert(END, ' ')
        elif value == " Tab ":
            Entry.focus_get(self).insert(END, '    ')
        else :
            Entry.focus_get(self).insert(END, value)

谢谢您的帮助!!在放弃并寻求帮助之前,我花了很长的夜晚努力解决这个问题。