使用按钮更改问题

时间:2017-08-28 18:19:32

标签: python button tkinter while-loop

我是Python编程的新手,我正在学习如何创建用户界面。我想创建一个非常基本的界面,它具有以下流程:使用while循环,界面显示包含在问题列表中的所有问题。每次出现问题时,问题下都会出现两个按钮(是 - 否)。只有在单击其中一个时,界面才会显示下一个问题。 我在这附上我试过的代码。

import tkinter as tk

questions=['Question 1','Question 2','Question 3','Question 4', 'Question 5']
root = tk.Tk()
root.minsize(300, 300)
answers=['Yes','No']
b_list = [] 

def ask():
    count=0
    while count<len(questions):
        lab=tk.Label(root,text=questions[count])
        lab.pack()
        count+=1

for i in range(2):
    b = tk.Button(root, text = answers[i],command=ask)
    b.grid(row = 0, column = i)

    b_list.append(b) 

root.mainloop()

此类代码根本不起作用。我想也是因为我在while循环中犯了一个错误,要求显示所有问题,而不是一次显示。有没有想过让这些代码工作? 谢谢你的时间!!

2 个答案:

答案 0 :(得分:2)

使代码无法运行有两个主要原因:

  1. 在一个脚本中,您无法使用两个或更多几何管理器编写GUI。这不仅适用于tkinter,也适用于其他GUI第三方库,如PyQt。
  2. 标签应在每一轮中显示不同的消息或问题。因此,这意味着您需要使用 StringVar 修改内容。它表现为字符串的变量。您可以了解更多here
  3. 我不清楚为什么要存储按钮以及用户保存结果的地方。

    这是我的代码:

    {{1}}

答案 1 :(得分:1)

这也可以以面向对象的方式完成,这可能会更好地适应未来的打样。

请参阅下面脚本的注释版本以获得解释和示例:

from tkinter import *
import random

class App:
    def __init__(self, root):
        self.root = root
        self.array = ["Question1", "Question2", "Question3", "Question4", "Question5"] #list containing questions
        self.answer = [] #empty list for storing answers
        self.question = Label(self.root, text=self.array[len(self.answer)]) #creates a text label using the element in the 0th position of the question list
        self.yes = Button(self.root, text="Yes", command=self.yescmd) #creates button which calls yescmd
        self.no = Button(self.root, text="No", command=self.nocmd) #creates button which calles nocmd
        self.question.pack()
        self.yes.pack()
        self.no.pack()
    def yescmd(self):
        self.answer.append("yes") #adds yes to the answer list
        self.command() #calls command
    def nocmd(self):
        self.answer.append("no") #adds no to the answer list
        self.command() #calls command
    def command(self):
        if len(self.answer) == len(self.array): #checks if number of answers equals number of questions
            self.root.destroy() #destroys window
            print(self.answer) #prints answers
        else:
            self.question.configure(text=self.array[len(self.answer)]) #updates the text value of the question label to be the next question
root = Tk()
App(root)
root.mainloop()

这基本上只是在我们只是配置label以显示问题list中的下一个元素而不是销毁它或弹出list的意义上的不同之处