我正在尝试为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会从当前关注的文本条目中删除所有文本。
答案 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)
谢谢您的帮助!!在放弃并寻求帮助之前,我花了很长的夜晚努力解决这个问题。