把窗户带到顶层

时间:2014-03-16 12:48:47

标签: python tkinter

我想一个接一个地提出几个问题。第一个问题显示为我喜欢,光标设置在输入字段中。然后我销毁窗口并再次调用该函数来创建一个新窗口。这次窗口没有显示在前面,因此我首先必须点击屏幕才能将光标设置到输入字段。在我点击屏幕将窗口置于顶部之前,转义键也不起作用。我很乐意为你提供帮助! 先感谢您! 这是我的代码:

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

1 个答案:

答案 0 :(得分:0)

在Tk中,您可以使用raise命令将窗口置于Z顺序的前面。但是,raise是Python中的关键字,因此已重命名为lift。如果您的应用程序仍然是前台应用程序,则可以在顶级窗口小部件上调用 lift()方法。如果应用程序不是前台应用程序,那么这将提升窗口,但仅在同一应用程序的其他窗口之上。在Windows上,这会导致应用程序的任务栏图标开始闪烁。

你可能最好破坏顶层的内容并替换它们。或者甚至更好 - 创建一些框架,每个页面都包含“#”页面。您的应用程序,并通过打包和pack_forgetting(或网格和网格忘记)切换每个框架的可见性。这样可以避免完全失去焦点 - 只需将焦点设置到每个帧的第一个小部件上,就可以将焦点设置为可见。