Python 3.5.1 Tkinter //条目小部件/框架管理问题

时间:2016-12-18 12:01:28

标签: python-3.x tkinter

所以我希望我的程序能够重置密码。问题是一切正常,第一次重置过程,但如果你想再次重置密码,它会变得邪恶,我找不到错误或解决方案。该计划第一次做什么以及应该做什么:

按下button3时,显示您必须输入当前pw的第一帧。如果按下键盘上的回车键,则右侧显示第二帧。在那里,设置一个新的pw并通过按Enter键显示第三帧。键入您在第二帧中使用的相同pw,即pw设置帧。如果两个pw相同则返回标题屏幕。

第二个+时间,按下PROBLEM:按钮3,它显示第一帧,但光标不在第一次的条目字段中(entry.focus_set()在代码中),但是光标是在第三个输入字段(最后一个,pw确认,帧),甚至没有.pack()ed或.raised或其他任何东西。如果我单击第一帧的条目(我实际上将在此处),并确认它显示第二帧,就像它应该是,但光标现在位于第一帧的条目,甚至没有活动因为它只是.pack_forget()。如果我进入第三帧,则光标位于第二帧的条目中。

from tkinter import *
root = Tk()

pw_actual = ""
pw_first = ""

def ssc_title():
    sc_pw.pack_forget()
    sc_pw_second.pack_forget()
    sc_title.pack()

def ssc_pw_change():
    sc_title.pack_forget()
    sc_pw_testing.pack()

def ssc_pw_first():
    sc_pw_testing.pack_forget()    
    sc_pw_first.pack()

def ssc_pw_second():
    sc_pw_first.pack_forget()
    sc_pw_second.pack()
#-----------------------------------
def ev_pw_testing(event):
    pw_proof = en_pw_testing.get()
    if pw_proof == pw_actual:
        en_pw_testing.delete(0, END)
        ssc_pw_first()
    else:
        en_pw_testing.delete(0, END)

def ev_pw_first(event):
    global pw_first
    pw_first = en_pw_first.get()
    if pw_first == "":
        errormessage("Please enter a password")
    else:
        en_pw_first.delete(0, END)
        ssc_pw_second()

def ev_pw_second(event):
    global pw_first
    pw_second = en_pw_second.get()
    if pw_first == pw_second:
        write(pw_second)        
        en_pw_second.delete(0, END)
        ssc_title()
    else:
        errormessage("Passwords don't match")
        en_pw_second.delete(0, END)
#------------------
sc_pw_testing = Frame(root, bg=bgclr)
lab_pw_testing = Label(sc_pw_testing, text="Please enter the password", bg=bgclr, fg=fontclr, font=font_12).pack(ipady=10)
en_pw_testing = Entry(sc_pw_testing, show="X")
en_pw_testing.pack()
en_pw_testing.focus_set()
en_pw_testing.bind("<Return>", ev_pw_testing)

sc_pw_first = Frame(root, bg=bgclr)
lab_pw_first = Label(sc_pw_first, text="Set new password", bg=bgclr, fg=fontclr, font=font_12).pack(ipady=10)
en_pw_first = Entry(sc_pw_first, show="X")
en_pw_first.pack() 
en_pw_first.focus_set()
en_pw_first.bind("<Return>", ev_pw_first) 

sc_pw_second = Frame(root, bg=bgclr)
lab_pw_second = Label(sc_pw_second, text="Confirm password", bg=bgclr, fg=fontclr, font=font_12).pack(ipady=10) 
en_pw_second = Entry(sc_pw_second, show="X")
en_pw_second.pack()
en_pw_second.focus_set()
en_pw_second.bind("<Return>", ev_pw_second)

sc_title = Frame(root, bg=bgclr)
bttn3 = Button(sc_title, text="Password reset", bg=bgclr, fg=fontclr, font=font_12, relief=FLAT, command=ssc_pw_change).pack()

#------------

root.mainloop()

(这里我没有包含不相关的函数等错误消息,只是创建一个窗口或泡菜的东西,因为那时它太长了,问题似乎不在那里。)

就像我说的那样 - 第一次更改密码效果很好。在第一次出现相同问题后每隔一段时间。让它再次工作的唯一方法是重新启动程序。我正在尝试以下解决方案:

  • 在再次进入重置过程之前重置全局变量
  • 切换帧并使用后重置全局变量
  • 将每个框架(或页面,如果您愿意)放入函数
  • 将每个框架(或页面)放入Switch between two frames in tkinter教程
  • 之后的类中
  • 将框架/页面切换功能退出并将.pack()和.pack_forget()放在pw检查(事件)函数中
  • 而不是使用网格打包
  • 使用(“”,lambda事件:function())

每个解决方案就像现在的代码一样工作,根本没有变化,问题仍然存在。

我的意思是我可以解决它,比如禁用按钮,这样你只能在每个会话中重置一次pw,但没有理由为什么它应该是这样,甚至省略entry.focus_set(),所以无论如何都必须单击输入字段,并且问题永远不会发生(在每次输入字符之前单击每个输入字段非常烦人)。

我没有想法,我可以尝试做不同的事情。我觉得错过森林的树木。来吧伙计们,给我一个屁股,我在这里错过了什么!?

0 个答案:

没有答案