<p>这是一个棘手的问题,因为检查下面的每一个值都不起作用</p>
<pre><code>def Chk_Prereq(self):
Courses = [
"Quality Management (Adv.)",
"Financial Management (Adv.)",
"Project Management (Adv.)",
"Project Management (Int.)"
]
boo = 1
self.varl1 = self.L1.get(self.L1.curselection())
for idx, item in enumerate(Courses):
if self.varl1 != item:
boo = 0
else:
boo = 1
if boo == 1:
self.EvalInput()
else: messagebox.showwarning("Course selection missing")
</code></pre>
<p>针对如下所示的变量类型进行检查也会失败</p>
<pre><code>isinstance(self.L1.get(self.L1.curselection()), str)
</code></pre>
<p>所以我继续处理异常,我认为这在Python中很常见,在vba中不太常见,因为vba在这种情况下更灵活。我将能够看到listbox选择在内存中确切地引用了什么作为数据类型。Python在控制台窗口中抛出一条消息,该消息不会提供太多信息,并且会让用户想知道一个包含更多条目的表单缺少什么</p>
<p>使用异常处理对我来说是危险的,因为如果我看不到其他东西在那个块的内部或外部,我需要几个小时才能看到它在哪里。由于我正在开始学习,我(想)以后我会理解得更好(时间会证明的)。我输入的代码用于说明</p>
<pre><code>#!/usr/bin/env python3
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self):
super().__init__()
self.create_widgets()
def create_widgets(self):
#Label(master, text="First Name").grid(row=0)
self.master.title("Application")
self.pack(fill=BOTH, expand=True)
Label(self, text="First Name").grid(row=0,column=0)
self.e1 = Entry(self)
self.e1.grid(row=0, column=1)
Label(self, text="Last Name").grid(row=1,column=0)
self.e2 = Entry(self)
self.e2.grid(row=1, column=1)
Label(self, text="Age").grid(row=2, column=0)
self.e3 = Entry(self)
self.e3.grid(row=2, column=1)
#Blank
Label(self, text="").grid(row=2, column=0)
Label(self, text="Gender").grid(row=0, column=4)
self.f1=Frame(self, relief="sunken", borderwidth = 1)
self.v=IntVar()
self.r1=Radiobutton(self.f1, text="Male", variable=self.v, value=1).pack(anchor=W)
self.r2=Radiobutton(self.f1, text="Female", variable=self.v, value=2).pack(anchor=W)
self.f1.grid(row=1, column=4)
Label(self, text="").grid(row=3)
#Course Applied For
Label(self, text="Course Applied for:", wraplength=60).grid(row=4)
self.L1 = Listbox(self, width = 25, height = 4)
Courses = [
"Quality Management (Adv.)",
"Financial Management (Adv.)",
"Project Management (Adv.)",
"Project Management (Int.)"
]
for idx, item in enumerate(Courses):
self.L1.insert(END, item)
self.L1.grid(row=4, column=1)
#Buttons
self.f2=Frame(self)
self.w=Button(self.f2, text ="Prerequisites", width=10, command=self.Chk_Prereq, default=ACTIVE).pack()
self.w1=Button(self.f2, text ="Clear", width=10, command=self.Clear).pack()
self.w2=Button(self.f2, text ="Cancel", width=10, command=self.quit).pack()
self.f2.grid(row=4, column=4)
#Blank
Label(self, text="").grid(row=6)
#Checkbox
self.var=IntVar()
self.c=Checkbutton(self, text="Part-Time Course", variable=self.var, offvalue=0, onvalue=1)
self.c.grid(row=7, column=0)
def Chk_Prereq(self):
self.EvalInput()
def EvalInput(self):
self.fname = self.e1.get()
self.lname = self.e2.get()
self.age = int(self.e3.get())
#Check for Age
if self.age < 21:
messagebox.showwarning("Invalid Age",\
"You are not eligible")
return
#Check for Gender
if self.v.get()==1:
self.str1 = "Dear Mr."
elif self.v.get()==2:
self.str1 = "Dear Ms."
else:
messagebox.showwarning("Missing Info", \
"Please select the appropriate gender")
return
#Check for Prereq Course
self.name = self.str1 + " " + self.fname + " " + self.lname
try:
self.varl1 = self.L1.get(self.L1.curselection())
if self.varl1 == "Quality Management (Adv.)":
self.prereq = "The prereq for this course is Quality Management (Int)."
self.flag = 1
elif self.varl1 == "Financial Management (Adv.)":
self.prereq = \
"The prereq for this course is Financial Management (Bas)."
self.flag = 1
elif self.varl1 == "Project Management (Adv.)":
self.prereq = \
"The prereq for this course is Project Management (Int)."
self.flag = 0
else:
self.prereq = \
"The prereq for this course is Project Management (Bas)."
self.flag = 0
#Check whether Part Time
if self.var.get() == 1 and self.flag == 0:
self.str2 = "\nThis course is not available part time."
elif self.var.get() == 1 and self.flag == 1:
self.str2 = "\nThis course is available part time."
else:
self.str2 = ""
self.result = self.prereq + self.str2
messagebox.showinfo(self.name, self.result)
except:
self.prereq = "No course selection made"
self.result = self.prereq
messagebox.showinfo(self.name, self.result)
def Clear(self):
self.e1.delete(0,END)
self.e2.delete(0,END)
self.e3.delete(0,END)
self.c.deselect()
self.L1.select_clear(self.L1.curselection())
def main():
root = Tk()
app = Application()
root.mainloop()
if __name__ == '__main__':
main()
</code></pre>
<p>感谢您的上述评论,但我认为处理异常是唯一的答案。请张贴完整的代码,如果这不是tk listbox的未来使用可能会有帮助的情况,我会将其标记为答案和投票</p>