tkinter калькулятор, но с буквами (случайное отображение кнопок)

castmocushiom

Новичок
Пользователь
Окт 12, 2021
2
0
1
Есть игра, похожая на калькулятор, в которой собирается слово, это сделано, помогите реализовать "сложный режим", когда при активном чекбоксе буквы(кнопки) меняют свое местоположение и состав букв остается такой же, сейчас кнопки статичны.
Небольшое пояснение к коду: загаданное слово генерируется случайно, затем преобразуется в список, чтобы взять из списка символы для кнопок, для добавления "лишних кнопок" создается еще один случайный список. При каждом нажатии кнопки в результирующий список попадает символ, потом сравнение.
Python:
from tkinter import *
from tkinter import messagebox
import random
import string
import sys

def calc(key):
    answer_label.destroy()
    hard_check.destroy()
# if window.hard.get() == 1:
    # добавляем буквы в список из кнопок
    for i in key:
      if key == char_list[0]:          #для символов из загаданного слова
        rez_list.append(char_list[0])
      elif key == char_list[1]:
        rez_list.append(char_list[1])
      elif key == char_list[2]:
        rez_list.append(char_list[2])
      elif key == char_list[3]:
        rez_list.append(char_list[3])
      elif key == char_list[4]:
        rez_list.append(char_list[4])
      elif key == rand_list[0]:        #для символов из лишних кнопок
        rez_list.append(rand_list[0])
      elif key == rand_list[1]:
        rez_list.append(rand_list[1])
      elif key == rand_list[2]:
        rez_list.append(rand_list[2])
      elif key == rand_list[3]:
        rez_list.append(rand_list[3])
      elif key == "Exit":
        sys.exit()
    rez_string = ''.join(rez_list)
    rez = Label(text=rez_string, bg="Yellow", fg="Black")
    rez.place(relx=.5, rely=.6)
    if len(rez_list)==len(char_list):
     if rez_list==char_list:
        messagebox.showinfo("Результат", "Вы выиграли!")
        sys.exit()
     else:
        messagebox.showerror("Результат", "Вы проиграли!")
        sys.exit()

def generate_random_string(length):
    letters = string.ascii_lowercase
    rand_string = ''.join(random.choice(letters) for i in range(length))
    return rand_string

window = Tk()
window.title('Игра с клавиатурой')
window.geometry('400x200')
length = 5
window.hard = IntVar()
hard_check = Checkbutton(window, text="Сложный режим", variable=window.hard)
hard_check.place(relx=.3, rely=.4)
window.answer = generate_random_string(length)
# print("Random string is:", window.answer)
char_list = []  # пустой список для загаданного слова
rez_string=[]
for c in window.answer:  #буквы в список
    char_list.append(c)
# print(char_list)
rez_list = []
rand_list = []

# # buttons
rand_sym=generate_random_string(length)
for c in rand_sym:  # добавляем буквы в список
    rand_list.append(c)
answer_label = Label(text="Загаданное слово: " +window.answer, fg="#eee", bg="#333")
answer_label.place(relx=.3, rely=.3)
bttn_list = [
    char_list[0], rand_list[0], rand_list[1],
    char_list[1], rand_list[2], rand_list[3],
    char_list[2], char_list[3], char_list[4],"Exit"
]
r = 1
c = 0

for i in bttn_list:
    rel = ""
    cmd = lambda x=i: calc(x)
    Button(window, text=i, command=cmd, width=10).grid(row=r, column=c)
    c += 1
    if c > 4:
        c = 0
        r += 1
window.mainloop()
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 672
478
83
когда при активном чекбоксе буквы(кнопки) меняют свое местоположение
что это значит? вы хотите чтобы они постоянно плавали по окну? как они должны менять положения?

если просто перемешаться, то можно перемешать список с кнопками и размещать их по новой...

в вашем коде объединил создание кнопок в функцию, ничего не исправлял...
Python:
from tkinter import *
from tkinter import messagebox
import random
import string
import sys
import random

def calc(key):
    answer_label.destroy()
    hard_check.destroy()
# if window.hard.get() == 1:
    # добавляем буквы в список из кнопок
    for i in key:
      if key == char_list[0]:          #для символов из загаданного слова
        rez_list.append(char_list[0])
      elif key == char_list[1]:
        rez_list.append(char_list[1])
      elif key == char_list[2]:
        rez_list.append(char_list[2])
      elif key == char_list[3]:
        rez_list.append(char_list[3])
      elif key == char_list[4]:
        rez_list.append(char_list[4])
      elif key == rand_list[0]:        #для символов из лишних кнопок
        rez_list.append(rand_list[0])
      elif key == rand_list[1]:
        rez_list.append(rand_list[1])
      elif key == rand_list[2]:
        rez_list.append(rand_list[2])
      elif key == rand_list[3]:
        rez_list.append(rand_list[3])
      elif key == "Exit":
        sys.exit()
    rez_string = ''.join(rez_list)
    rez = Label(text=rez_string, bg="Yellow", fg="Black")
    rez.place(relx=.5, rely=.6)
    if len(rez_list)==len(char_list):
     if rez_list==char_list:
        messagebox.showinfo("Результат", "Вы выиграли!")
        sys.exit()
     else:
        messagebox.showerror("Результат", "Вы проиграли!")
        sys.exit()

def generate_random_string(length):
    letters = string.ascii_lowercase
    rand_string = ''.join(random.choice(letters) for i in range(length))
    return rand_string


def butt():
    # # buttons
    rand_sym = generate_random_string(length)
    for c in rand_sym:  # добавляем буквы в список
        rand_list.append(c)
    answer_label = Label(text="Загаданное слово: " + window.answer, fg="#eee", bg="#333")
    answer_label.place(relx=.3, rely=.3)
    bttn_list = [
        char_list[0], rand_list[0], rand_list[1],
        char_list[1], rand_list[2], rand_list[3],
        char_list[2], char_list[3], char_list[4], "Exit"
    ]
    random.shuffle(bttn_list)
    r = 1
    c = 0

    for i in bttn_list:
        rel = ""
        cmd = lambda x=i: calc(x)
        Button(window, text=i, command=cmd, width=10).grid(row=r, column=c)
        c += 1
        if c > 4:
            c = 0
            r += 1

window = Tk()
window.title('Игра с клавиатурой')
window.geometry('400x200')
length = 5
window.hard = IntVar()
hard_check = Checkbutton(window, text="Сложный режим", variable=window.hard, command=butt)
hard_check.place(relx=.3, rely=.4)
window.answer = generate_random_string(length)
# print("Random string is:", window.answer)
char_list = []  # пустой список для загаданного слова
rez_string=[]
for c in window.answer:  #буквы в список
    char_list.append(c)
# print(char_list)
rez_list = []
rand_list = []

butt()
window.mainloop()
 
Последнее редактирование:
  • Мне нравится
Реакции: castmocushiom

castmocushiom

Новичок
Пользователь
Окт 12, 2021
2
0
1
что это значит? вы хотите чтобы они постоянно плавали по окну? как они должны менять положения?

если просто перемешаться, то можно перемешать список с кнопками и размещать их по новой...

в вашем коде объединил создание кнопок в функцию, ничего не исправлял...
Python:
from tkinter import *
from tkinter import messagebox
import random
import string
import sys
import random

def calc(key):
    answer_label.destroy()
    hard_check.destroy()
# if window.hard.get() == 1:
    # добавляем буквы в список из кнопок
    for i in key:
      if key == char_list[0]:          #для символов из загаданного слова
        rez_list.append(char_list[0])
      elif key == char_list[1]:
        rez_list.append(char_list[1])
      elif key == char_list[2]:
        rez_list.append(char_list[2])
      elif key == char_list[3]:
        rez_list.append(char_list[3])
      elif key == char_list[4]:
        rez_list.append(char_list[4])
      elif key == rand_list[0]:        #для символов из лишних кнопок
        rez_list.append(rand_list[0])
      elif key == rand_list[1]:
        rez_list.append(rand_list[1])
      elif key == rand_list[2]:
        rez_list.append(rand_list[2])
      elif key == rand_list[3]:
        rez_list.append(rand_list[3])
      elif key == "Exit":
        sys.exit()
    rez_string = ''.join(rez_list)
    rez = Label(text=rez_string, bg="Yellow", fg="Black")
    rez.place(relx=.5, rely=.6)
    if len(rez_list)==len(char_list):
     if rez_list==char_list:
        messagebox.showinfo("Результат", "Вы выиграли!")
        sys.exit()
     else:
        messagebox.showerror("Результат", "Вы проиграли!")
        sys.exit()

def generate_random_string(length):
    letters = string.ascii_lowercase
    rand_string = ''.join(random.choice(letters) for i in range(length))
    return rand_string


def butt():
    # # buttons
    rand_sym = generate_random_string(length)
    for c in rand_sym:  # добавляем буквы в список
        rand_list.append(c)
    answer_label = Label(text="Загаданное слово: " + window.answer, fg="#eee", bg="#333")
    answer_label.place(relx=.3, rely=.3)
    bttn_list = [
        char_list[0], rand_list[0], rand_list[1],
        char_list[1], rand_list[2], rand_list[3],
        char_list[2], char_list[3], char_list[4], "Exit"
    ]
    random.shuffle(bttn_list)
    r = 1
    c = 0

    for i in bttn_list:
        rel = ""
        cmd = lambda x=i: calc(x)
        Button(window, text=i, command=cmd, width=10).grid(row=r, column=c)
        c += 1
        if c > 4:
            c = 0
            r += 1

window = Tk()
window.title('Игра с клавиатурой')
window.geometry('400x200')
length = 5
window.hard = IntVar()
hard_check = Checkbutton(window, text="Сложный режим", variable=window.hard, command=butt)
hard_check.place(relx=.3, rely=.4)
window.answer = generate_random_string(length)
# print("Random string is:", window.answer)
char_list = []  # пустой список для загаданного слова
rez_string=[]
for c in window.answer:  #буквы в список
    char_list.append(c)
# print(char_list)
rez_list = []
rand_list = []

butt()
window.mainloop()
спасибо большое, не знал про shuffle, немного другое имел в виду, чтобы при активном чекбоксе все клавиши перемешивались, но это уже сам доделал
 

Форум IT Специалистов