如何处理python模块tkinter中的单击按钮事件 [英] How to handle a click button event in python module tkinter

查看:32
本文介绍了如何处理python模块tkinter中的单击按钮事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 tkinter 在 python 中制作一个问题游戏.我正在努力定义一个函数,该函数可以检查玩家点击的答案并添加到分数,然后在答案下方打印出来.

I am trying to make a question game in python using tkinter. I am struggling to define a function that can check the answer that the player clicked on and add to a score that is then printed out below the answers.

每当我点击代码的结果是分数为 0 并且问题和答案没有改变.另外,如果我反复单击,它会在彼此下方打印 0 作为标签.

The outcome of the code whenever I click is that the score is 0 and the question and answers don't change. Also, if I click repeatedly, it prints 0 as a label below each other.

我只包含了我所有的代码,这样如果有人想自己测试代码,就不会抛出任何错误.

I only included all of my code so that if someone wanted to test the code out for themselves, it wouldn't throw up any errors.

import tkinter
import random
from random import shuffle

score = 0

def check_answer(answer):
    if answer == answers[s][0] or answer == answers[s][1]:
        global score
        score += 1
    lbl = tkinter.Label(window, text=score)
    lbl.pack()


#This sets up a window and names it "The Hunt" but doesn't generate the window
window = tkinter.Tk()
window.title("The Hunt!")

#This sets the background colour
window.configure(background="#1C3F95")

#This generates labels and buttons that are the same or similar colour to the background
welcome = tkinter.Label(window, text="Welcome to the Hunt!", bg="#1C3F95")
begin = tkinter.Button(window, text="Click here to begin", bg="#1C7C95")


#This is my code for the question generation. As I made that for a pygame window, I obviously had to change it slightly

questions = ["What species of bird is also a nickname for New Zealand?", "Which Twins can you play as in Assassin's Creed Syndicate?",
                 "Which year was 'Killing In The Name' Christmas Number one?"]

answers = [["kiwi", "Kiwi", "Falcon", "Sparrow", "Crow"], ["frye", "Frye", "Bank", "Green", "Bundy"], ["2009", "2009",
                                                                                                       "1999", "1993",
                                                                                                       "2004"]]
#I had to do it in two separate lists as it's easier to work with later on
# Also I made the correct answers non-case sensitive to make it easier to test.

r = len(questions)
score = 0
s = random.randrange(0, r, 1)
#This generates a random number within the range of how many questions there are
# and then prints out that question

#This generates a label that displays the randomly generated question
question = tkinter.Label(window, text=questions[s])


list = answers[s]
output = []

for i in range(1, 5):
    output.append(answers[s][i])
shuffle(output)


# this takes the answers that correspond with the randomly generated question and shuffles the answers
# I did this as otherwise, the answer would always be the first answer to appear and the player could exploit this

#This code is what displays the labels and buttons on the window. It lets the computer decide where the best place for
#each component is
welcome.pack()
begin.pack()
question.pack()

for i in output:
    answer = tkinter.Button(window, text=i, command=lambda answer = i: check_answer(i))
    answer.pack()


#I had decided to pack the answers like this as it was easier than typing out each element of the list and also
#more efficent
window.mainloop()
#this is the code that actually generates the window

推荐答案

从顶部开始,让我们更改您的 check_answer 定义,不要每次都创建新标签:

Starting at the top, let's change your check_answer definition to not create a new label every time:

def check_answer(answer):
    if answer == answers[s][0] or answer == answers[s][1]:
        global score
        score += 1
        lbl["text"] = score

接下来,我们需要在你的 for 循环中做一个小改动:我们要发送答案,而不是 i:

Next, we need one small change in your for loop: we want to send answer, not i:

for i in output:
    answer = tkinter.Button(window, text=i, command=lambda answer = i: check_answer(answer))
    answer.pack()

lbl = tkinter.Label(window, text=score)
lbl.pack()

最后,我们会将之前移除的标签添加到您最初拥有它的底部.您可以通过将其更快地打包到代码中来更改它的位置以实现美观.一旦回答(正确或不正确),您的代码仍然不会循环到新问题,但至少现在您可以看到用户何时正确回答.

Lastly, we'll add that label that we removed earlier down to the bottom where you had it initially. You can change the location of this by packing it sooner in the code for aesthetics. Your code still doesn't cycle to a new question once one is answered (correctly or otherwise), but at least now you can see when the user answers correctly.

希望这会有所帮助.

这篇关于如何处理python模块tkinter中的单击按钮事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆