我想一个接一个地提出几个问题。第一个问题显示为我喜欢,光标设置在输入字段中。然后我销毁窗口并再次调用该函数来创建一个新窗口。这次窗口没有显示在前面,因此我首先必须点击屏幕才能将光标设置到输入字段。在我点击屏幕将窗口置于顶部之前,转义键也不起作用。我很乐意为你提供帮助! 先感谢您! 这是我的代码:
from Tkinter import *
def text_input_restricted(fn,question, nr_letters, limit, len_min, len_max,keys, justify):
class MyApp():
def validate(root, S):
return all(c in keys for c in S)
def __init__(self, q= None):
#save response after "next"-button has been clicked
def okClicked():
lines = e.get()
if len_min < len(lines) < len_max:
lines = unicode(lines).encode('utf-8')
datFile = open(fn, "a")
datFile.write(" '%s'"%(lines))
datFile.close()
self.root.destroy()
self.root = Tk()
vcmd = (self.root.register(self.validate), '%S')
#quit if escape-key has been pressed
self.root.bind('<Escape>', lambda q: quit())
#colors
color = '#%02x%02x%02x' % (200, 200, 200)
self.root.configure(bg=color)
#set window size to screen size
RWidth=MAXX
RHeight=MAXY
self.root.geometry(("%dx%d")%(RWidth,RHeight))
#remove buttons (cross, minimize, maximize)
self.root.overrideredirect(1)
#remove title
self.root.title("")
#item
labelWidget = Label(self.root,text=question, font=("Arial", int(0.02*MAXX)), bd=5, bg=color, justify="center")
labelWidget.place(x=0, y=RHeight/40,width=RWidth)
#"next"-button
ok_width = RWidth/15
ok_height = RWidth/15
okWidget = Button(self.root, text= "next", command = okClicked, font=("Arial",int(0.015*MAXX)), bd=5, justify="center")
okWidget.place(x=RWidth/2-ok_width/2,y=13*RHeight/40, width=ok_width,height=ok_height)
def callback(sv):
c = sv.get()[0:limit]
sv.set(c)
sv = StringVar()
width=nr_letters * int(0.02*MAXX)*1.3
sv.trace("w", lambda name, index, mode, sv=sv: callback(sv))
e = Entry(self.root, textvariable=sv,font=("Arial", int(0.02*MAXX)),justify=justify,validate="key", validatecommand=vcmd)
e.place(x=RWidth/2-width/2, y=9*RHeight/40, width=width)
#show cursor
e.focus_set()
self.root.mainloop()
MyApp()
MAXX=1366
MAXY=768
fn = "D:/test.dat"
text_input_restricted(fn = fn, question=u"f for female, m for male", nr_letters=1, limit =1, len_min =0, len_max=2, keys = 'fm', justify="center")
text_input_restricted(fn = fn, question="How old are you?", nr_letters=2,limit=2, len_min = 1, len_max = 3, keys = '1234567890',justify="center")
答案 0 :(得分:0)
在Tk中,您可以使用raise命令将窗口置于Z顺序的前面。但是,raise是Python中的关键字,因此已重命名为lift
。如果您的应用程序仍然是前台应用程序,则可以在顶级窗口小部件上调用 lift()方法。如果应用程序不是前台应用程序,那么这将提升窗口,但仅在同一应用程序的其他窗口之上。在Windows上,这会导致应用程序的任务栏图标开始闪烁。
你可能最好破坏顶层的内容并替换它们。或者甚至更好 - 创建一些框架,每个页面都包含“#”页面。您的应用程序,并通过打包和pack_forgetting(或网格和网格忘记)切换每个框架的可见性。这样可以避免完全失去焦点 - 只需将焦点设置到每个帧的第一个小部件上,就可以将焦点设置为可见。