问题
I currently have a working menu test for my restaurant that reads input received by checkbuttons, compares them to correct answers and then displays either a good job messagebox or a keep working messagebox. I also have it set up so that if they do not get the questions right, it prints what they answered followed by the correct answer. Instead of the message boxes and simply printing what they did wrong I would like to have a final results screen that either has a good job (or something along those lines) message or has the printed wrong vs correct answers on it. Here is my code to show you how I have implemented everything so far, like I said everything is working I am just trying to figure out a way to make it more presentable and haven't been able to find a way to do this.
from tkinter import *
import tkinter.messagebox as tkMessageBox
class GUI(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.initUI()
self.count = -1
self.answers = {'nft':[], 'nckt':[]}
self.menuItems = {'nft': ['Cheese', 'Cabbage', 'Corn', 'Blackened Fish', 'Salsa'],
'nckt': ['Lettuce', 'Cheese', 'Corn', 'Blackened Chicken', 'Salsa']}
self.menu = ['nft', 'nckt']
#self.p = PhotoImage(file="wahoos.gif")
#self.l = Label(self, image=self.p).grid(row=7, column=7)
def initUI(self):
self.grid()
self.parent.title("Wahoos Menu Test")
self.create_buttons()
def create_buttons(self):
for r in range(20):
for c in range(14):
Label(self, text='',
borderwidth=0).grid(row=r,column=c)
self.b = Button(self, text ="Begin Exam", relief=RIDGE, fg="black", command= self.on_button_press)
self.b.grid(row=19, column=7)
self.m = Label(self, text="")
self.m.grid(row=7, column=0)
L = Label(self, text="What comes in the following", fg="blue").grid(row=6, column=0)
self.tortButton = {'Flour':0, 'Corn':0, 'Wheat':0}
self.vegButton = {'Lettuce':0, 'Cabbage':0, 'Cheese':0,
'Ahee Rice':0, 'Brown Rice':0, 'Banzai Veg':0, 'Red Cabbage':0, 'Beans':0}
self.protButton = {'Carne Asada':0, 'Flamebroiled Chicken':0, 'Blackened Fish':0,
'Blackened Chicken':0, 'Flamebroiled Fish':0, 'Pork':0, 'Shrimp':0,
'Tofu':0, 'Blackened Mushroom':0, 'Rice and Beans':0, 'Banzai Veggies':0}
self.sauceButton = {'Salsa':0, 'Guacamole':0, 'Sour Cream':0,
'Roasted Pepper':0, 'Ketchup':0, 'Ranch':0, 'Balsamic':0,
'Mr. Lees':0, 'Teriyaki':0, 'Tapatio':0, 'Cream Cheese':0, 'Aioli':0}
V = Label(self, text="Veggies", fg="green").grid(row=1, column=11, sticky=W)
T = Label(self, text="Tortillas ", fg="green").grid(row=1, column=12, sticky=W)
P = Label(self, text="Proteins", fg="green").grid(row=1, column=13, sticky=W)
S = Label(self, text="Sauces", fg="green").grid(row=1, column=14, sticky=W)
c = 1
for key in self.tortButton:
c +=1
self.tortButton[key] = IntVar()
to = Checkbutton(self, text=key, variable=self.tortButton[key]).grid(row=c, column=12, sticky=W)
c = 1
for key in self.vegButton:
c += 1
self.vegButton[key] = IntVar()
vo = Checkbutton(self, text=key, variable=self.vegButton[key]).grid(row=c, column=11, sticky=W)
c = 1
for key in self.protButton:
c +=1
self.protButton[key] = IntVar()
po = Checkbutton(self, text=key, variable=self.protButton[key]).grid(row=c, column=13, sticky=W)
c = 1
for key in self.sauceButton:
c +=1
self.sauceButton[key] = IntVar()
so = Checkbutton(self, text=key, variable=self.sauceButton[key]).grid(row=c, column=14, sticky=W)
def on_button_press(self):
self.count = self.count + 1
if self.count == len(self.menu):
self.m.configure(text="")
self.b.configure(text ="Your Done! Click here to see your results.", command = self.compare)
else:
self.m.configure(text=self.menu[self.count])
self.b.configure(text ="Submit and Continue", command= self.read_checks)
def read_checks(self):
for key, value in self.vegButton.items():
state = value.get()
if state !=0:
print (key)
self.answers[self.menu[self.count]].append(key)
self.vegButton[key].set(0)
for key, value in self.tortButton.items():
state = value.get()
if state !=0:
print (key)
self.answers[self.menu[self.count]].append(key)
self.tortButton[key].set(0)
for key, value in self.protButton.items():
state = value.get()
if state !=0:
print (key)
self.answers[self.menu[self.count]].append(key)
self.protButton[key].set(0)
for key, value in self.sauceButton.items():
state = value.get()
if state !=0:
print (key)
self.answers[self.menu[self.count]].append(key)
self.sauceButton[key].set(0)
print (self.answers)
print (self.menuItems)
self.on_button_press()
def compare(self):
self.match = True
self.count = -1
for key in self.answers:
if self.answers[key] != self.menuItems[key]:
print ("For ", self.menu[self.count], " you answered ", self.answers[key])
print ("The correct answer for ", self.menu[self.count], " is ", self.menuItems[key])
self.count = self.count + 1
self.match = False
if self.match == True:
tkMessageBox.showinfo("All Pau!", "Nice job! I think your ready!")
else:
tkMessageBox.showinfo("Uh Ohh", "Looks like you have some more studying to do.")
def main():
root = Tk()
app = GUI(root)
root.mainloop()
if __name__ == '__main__':
main()
def compare(self)
is where I do my comparisons and print the output that I would like to appear on the results screen, this is also where I have the messageboxes pop up.
回答1:
I'd have the GUI inherit from Tk,
and then put the different "windows" in Frames.
You could then use grid_forget()
, or destroy()
, on a Frame to make it disappear.
Use grid()
on a frame to make it reappear, if you chose to not destroy it.
Here's a simplified demonstration,
where the original frame (aFrame) reappears after 3000ms of displaying the result frame (rFrame).
See the result_screen
and go_back
methods at the bottom:
import tkinter as tk
class GUI(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.score = 0
self.buttonDic = {
'Brown Rice':0,
'Banzai Veg':0,
'Red Cabbage':0,
'Black Beans':0
}
aFrame = self.aFrame = tk.Frame(self)
aFrame.grid()
for key in self.buttonDic:
self.buttonDic[key] = tk.IntVar()
aCheckButton = tk.Checkbutton(aFrame, text=key,
variable=self.buttonDic[key])
aCheckButton.grid(sticky='w')
submitButton = tk.Button(aFrame, text="Submit",
command=self.query_checkbuttons)
submitButton.grid()
self.trueList = ['Brown Rice', 'Black Beans']
def query_checkbuttons(self):
for key, value in self.buttonDic.items():
state = value.get()
if state != 0:
if key in self.trueList:
self.score += 1
else:
self.score -= 1
self.buttonDic[key].set(0)
self.result_screen()
def result_screen(self):
self.aFrame.grid_forget()
self.rFrame = tk.Frame(self)
self.rFrame.grid()
self.scoreText = tk.Text(self.rFrame, width=20, height=1)
self.scoreText.grid()
self.scoreText.insert('end', self.score)
self.after(3000, func=self.go_back)
def go_back(self):
self.score = 0
self.rFrame.destroy()
self.aFrame.grid()
gui = GUI()
gui.mainloop()
来源:https://stackoverflow.com/questions/10150041/python-3-2-tkinter-create-a-results-frame-to-display-output