【问题标题】:Python 3.2 tkinter create a results frame to display outputPython 3.2 tkinter 创建一个结果框架来显示输出
【发布时间】:2012-04-14 00:42:34
【问题描述】:

我目前对我的餐厅进行了一个有效的菜单测试,它读取检查按钮收到的输入,将它们与正确答案进行比较,然后显示 good job 消息框或 继续工作消息框。我还设置了它,如果他们没有正确回答问题,它会打印他们回答的内容,然后是正确答案。我想要一个最终的 results 屏幕,而不是消息框并简单地打印他们做错了什么,或者有一个很好的工作(或类似的东西)消息或上面印有错误与正确的答案。这是我的代码,向您展示到目前为止我是如何实现所有东西的,就像我说的一切都在工作我只是想找出一种方法让它更美观,但还没有找到一种方法来做到这一点。

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) 是我进行比较并打印我希望在结果屏幕上显示的输出的地方,这也是我弹出消息框的地方。

【问题讨论】:

  • 我正在阅读您发布的其他一些问题的代码。你的代码设计是非常程序化的——看起来你可以用更面向数据的方法做得很好。与其逐步接近程序,不如为每个单独的任务构建自包含的通用对象,然后将它们“粘合”在一起。它可以让你重用更多代码,节省打字,最终让你的程序更具可读性。
  • 我同意你的观点,我是 python 新手,这是我实际使用它编写的第一个主要内容,所以目前我只是在学习所有内容,然后计划回过头来清理它,将逻辑与 GUI 和所有这些分离。不过感谢您的评论。

标签: python python-3.x tkinter frame


【解决方案1】:

我会从 Tk 继承 GUI,
然后将不同的“窗口”放在 Frames 中。
然后,您可以在 Frame 上使用 grid_forget() 或 destroy() 使其消失。
如果您选择不销毁它,请在框架上使用 grid() 使其重新出现。
这是一个简化的演示,
其中原始帧 (aFrame) 在显示结果帧 (rFrame) 3000 毫秒后重新出现。
请参阅底部的result_screen 和go_back 方法:

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

【讨论】:

  • 非常感谢您的回复!我能够使用这种方法使其工作。但是,是否可以将我最初打印到命令行的输出打印到新框架?我尝试了很多不同的东西,但似乎无法使任何工作?我显然可以让它打印多行或我需要的多行,但我不知道如何从字典本身打印键和值......?
  • @crenfro 据我所知,您可以打印的任何内容都可以插入到文本小部件中。您可以先尝试格式化字符串,然后将该变量放入 insert() 方法中。我需要查看您当前的示例才能再说什么,从技术上讲,这将是一个单独的问题/答案。
  • 啊,你知道我以错误的方式使用 StringVar()。我让它工作了。再次感谢!!
猜你喜欢
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多