如何在 tkinter 中按下按钮时让隐藏的单词显示出来?

问题描述 投票:0回答:1

我为内存网格中的单词创建了一个单独的类,并且我试图将其隐藏起来,直到用户按下激活按钮类中的

toggle_info
方法的按钮。这不起作用。

我尝试为这些单词创建一个单独的类,以便它们不会在

for
方法中的
game_menu
函数中被覆盖,但按钮上的文本在按下时根本不会改变。 这是代码:

import tkinter as tk
import random

class Buttons:
    '''För att spelet ska komma ihåg informationen bakom varje knapp krävs det att informaitonen sparas som attribut o knappar klassen annars glömmer funktionen bort dem.'''
    
    def __init__(self, hidden_word, is_it_hidden=False):
        self.is_it_hidden = is_it_hidden
        self.hidden_word = hidden_word
    
    def get_hidden_word(self):
          # Måste titta närmare på vad som händer när man klickar på en knapp. Fundera på att göra en metod i den andra klassen.
        print(self.is_it_hidden)
        print(self.hidden_word)
        if self.is_it_hidden:
            return self.__str__()
        else:
            return '?'
        '''return self.hidden_word if self.is_it_hidden else '?'''
    
    def toggle_info(self):
        self.is_it_hidden = True
        return self.get_hidden_word()

        
    def __str__(self):
        return f'{self.hidden_word}'


    


class Huvudmeny:
    
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("Memory game")
        self.root.geometry("800x500")
            
        self.label = tk.Label(self.root, text="Hur stor matris vill du spela med? (A*A). Du måste välja ett jämt tal.", font = ("Arial", 18), background="White", foreground="Black")
        self.label.pack(padx=10, pady=10)

        self.entry_var = tk.StringVar()
        self.entry = tk.Entry(self.root, text= 'A= ', textvariable=self.entry_var, font=("Arial", 18))
        self.entry.pack(padx=20, pady=20)

        self.button = tk.Button(self.root, text= "Klar", font=("Arial", 18), command=self.move_forward)
        self.button.pack(padx=12, pady=12)

        self.words = 0
        self.word_list = []
        self.number_of_words = None
        self.hidden_words = None
        self.words_used = []
        self.button_instances = []
        self.root.mainloop()
        


    def game_menu(self):
        for i, self.button_instances in enumerate(self.button_instances):
            self.button = tk.Button(self.root, text=Buttons(self.button_instances).get_hidden_word(), command= lambda: Buttons.toggle_info(self.button_instances))#
            self.button.grid(row=i // self.words, column=i % self.words, padx=10, pady=10)
            '''self.hidden_words = self.button.cget('text')
            self.button.config(text='?')   
            print(self.hidden_words)'''

    def move_forward(self):
        integer_check = int(self.entry_var.get())
        if integer_check % 2 == 0:
            self.words = integer_check
            self.number_of_words = int((integer_check**2)/2)
            for widget in self.root.winfo_children():
                widget.destroy()
            self.memory_init()
            self.game_menu()

        else:
            print('Var vänlig skriv ett jämt heltal.')
            return self.move_forward(self)
    
    

    def memory_init(self) -> list:
        ord = 'memo.txt'
        with open(ord, 'r', encoding='utf-8') as file:
            self.word_list = file.readlines()

        # Gör ord_denna_macth till self.ord_denna_match
        self.words_used = random.sample(self.word_list, self.number_of_words) * 2
        random.shuffle(self.words_used)

        
        for i in range(0, len(self.words_used)):
            self.words_used[i] = self.words_used[i][:-1]
            button_instance = Buttons(self.words_used[i])
            self.button_instances.append(button_instance)
            print(self.button_instances)
        
        return self.words_used  




Huvudmeny()
class tkinter grid-layout
1个回答
0
投票

请注意,调用

Buttons.toggle_info()
不会自动更新按钮的文本。您需要在按钮上调用
.config(text=...)
来更新按钮的文本:

class Huvudmeny:
    ...

    def game_menu(self):
        # use local variables instead of instance variables
        for i, button_instance in enumerate(self.button_instances):
            button = tk.Button(self.root, text=button_instance.get_hidden_word())
            # use default values of function arguments to pass
            # the required instances of the button and `Buttons` class
            button.config(command=lambda btn=button, i=button_instance: btn.config(text=i.toggle_info()))

    ...

另请注意,应修改

toggle_info()
以实际切换实例变量
self.is_it_hidden
,如下所示:

class Buttons:
    ...

    def toggle_info(self):
        # toggle the instance variable
        self.is_it_hidden = not self.is_it_hidden
        return self.get_hidden_word()
    
    ...
© www.soinside.com 2019 - 2024. All rights reserved.