<p>你不想使用两个<code>mainloop</code>。一般来说,你的tkinter应用程序应该有一个<code>.mainloop</code>名为。你知道吗</p>
<p>至于如何获得登录弹出窗口,然后切换到窗口。。。你可以用应用程序创建你的根窗口,当你启动你的程序时,会有一个<code>Toplevel</code>窗口显示登录信息,也许会另外隐藏/收回根?,让顶层有一个提交按钮或一些可以验证凭据的东西。如果凭据有效,那么您可以使用<code>destroy()</code>方法删除主应用程序的顶级小部件/转到根窗口。你知道吗</p>
<p>有一个<code>while True</code>重复创建GUI+mainloop的过程显然是不好的。你知道吗</p>
<p><strong>编辑</strong>:对于可变对象来说,static可能不是一个好词,因为它是可变的。。。为全局添加了tuple vs list。你知道吗</p>
<p>您不需要创建一个空列表,然后使用<code>append</code>将您的用户名添加到<code>usernames</code>列表中。你可以让这个全球化。因为username是一个可变的对象(它是一个列表),所以您仍然可以在这个全局对象上的代码中的其他地方执行操作,比如.append等等。或者,如果您从未进行过这些更改,我会将其设为一个元组,因为它们是不可变的,而且这更符合您的意图。你知道吗</p>
<p>与使用<code>.count(*)</code>获取列表中某个元素的出现次数不同,您只需使用:</p>
<pre><code>if (object) in (some list) #Object is an abstraction, not the type
</code></pre>
<p>如果<code>CodeReal</code>是静态的(看起来是静态的),那么也可以将其设为全局的。你知道吗</p>
<p>下面是对代码的一个快速编辑,您可以不使用类来完成此操作,但是我在这里使用类来尝试清楚地显示程序中的逻辑分隔。你知道吗</p>
<p>我还更改了一些变量名,这样更容易阅读/理解。我还使用了<code>.pack()</code>和<code>.grid()</code>,因为这比在任何地方使用<code>.place()</code>都要快——这是一个任意的选择。你知道吗</p>
<pre><code>import Tkinter as tk
import tkMessageBox as messagebox
import sys
#No need to do usernames = list() and then .append for each one.
#Just make a global list holding them all...
USERNAMES = ('Mordecai', 'Ezekiel', 'Goliath', 'Abraham', 'Bartholomew',
'Jedediah', 'Solomon', 'Tobias', 'Yohanan', 'Lucifer')
PASSWORD = '116987' #Was CodeReal, this can be global
#We overrode the closing protocol here.
def closing_protocol():
if messagebox.askokcancel("Quit", "Do you want to quit?"):
sys.exit()
#A container for our Login "app".
class Login(tk.Toplevel):
def __init__(self, *args, **kwargs):
#We init the toplevel widget.
tk.Toplevel.__init__(self, *args, **kwargs)
#We set the closing protocol to be the overridden version / func.
self.wm_protocol("WM_DELETE_WINDOW", closing_protocol)
tk.Label(self, text='Username').grid(row=0, column=0)
self.username = tk.Entry(self)
self.username.grid(row=0, column=1)
tk.Label(self, text='Password').grid(row=1, column=0)
#Show = '*' just hides the password instead of plain-text like
#you typically see
self.password = tk.Entry(self, text='Password', show='*')
self.password.grid(row=1, column=1)
#When the button is clicked the _callback function will be called
tk.Button(self, text='Login', command=self._callback).\
grid(row=2, column=0, columnspan=2, sticky="nsew")
def _callback(self):
#If the username or password is bad, raise an error message.
if (self.username.get() not in USERNAMES or
self.password.get() != PASSWORD):
messagebox.showerror("Validation Error!",
"You have entered invalid credentials.\n" +
"Please try again.")
#otherwise, we're good to go. Destroy login / show main app.
else:
root.deiconify()
app.pack()
self.destroy()
class Main(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
tk.Label(self, text="MAIN APP STUFF").pack()
if __name__ == '__main__':
root = tk.Tk()
root.withdraw() #Hides the root window initially.
app = Main(root)
Login()
root.mainloop()
</code></pre>