我为内存网格中的单词创建了一个单独的类,并且我试图将其隐藏起来,直到用户按下激活按钮类中的
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()
请注意,调用
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()
...