Кликер на Python через tkinter
Помогите пожалуйста, пробовал и так, и сяк, не получается.
import tkinter as tk root = tk.Tk() # Основное окно root.title("Кликер") # Надпись в топе окна root.geometry("700x350") # Размер окна X root.resizable(False,False) # Запрещение изменение окна по X и Y root.configure(bg="#d1ddde") # Фон окна n = 0 # Счётчик def nplus(): global n n += 1 if n
Отслеживать
75.2k 120 120 золотых знаков 38 38 серебряных знаков 57 57 бронзовых знаков
задан 21 ноя 2023 в 18:59
21 3 3 бронзовых знака
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Вроде поправил, проверьте пожалуйста:
import tkinter as tk # Создание главного окна: root = tk.Tk() # Основное окно root.title("Кликер") # Надпись в топе окна root.geometry("700x350") # Размер окна X root.resizable(False, False) # Запрещение изменения окна по X и Y root.configure(bg="#d1ddde") # Фон окна n = 0 # Счётчик def nplus(): global n n += 1 if n == 1: label1["text"] = str(n) + " Рубль." elif 1 < n
Отслеживать
ответ дан 21 ноя 2023 в 19:10
2,938 2 2 золотых знака 4 4 серебряных знака 20 20 бронзовых знаков
спасибо огромное!
21 ноя 2023 в 19:35
Как вариант, проверьте.
import tkinter as tk root = tk.Tk() # Основное окно root.title("Кликер") # Надпись в топе окна root.geometry("700x350") # Размер окна X root.resizable(False,False) # Запрещение изменение окна по X и Y root.configure(bg="#d1ddde") # Фон окна n = 0 # Счётчик def nplus(): global n n += 1 # . vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv n_1 = str(n)[-1] n_2 = str(n)[-2:] #print(f' --- ') if '11'
Отслеживать
ответ дан 21 ноя 2023 в 19:49
75.2k 120 120 золотых знаков 38 38 серебряных знаков 57 57 бронзовых знаков
- python
- python-3.x
- tkinter
- gui
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8420
Софт Кликер. Часть [1] Python
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.
wan_zona
Новичок
Автор темы
Всем привет, данный кликер был создан на коленке с целью его улучшению.
Для работы нужно в папку с кодом нужно создать папку 'rezults.txt'
По умолчанию должны быть введены значения
0 0.1 0.4
ОБЕЗАТЕЛЬНО УСТАНОВИТЬ ПРИКРИПЛЕННЫЕ ФАЙЛИ В ОДНУ ПАПКУ.
Код кликера:
from tkinter import * #Автор wan_zona f = open('rezults.txt') #Выполняется для сохранения статистики n = float(f.readline()) z = float(f.readline()) count = float(f.readline()) f.close() tk = Tk() tk.title('Clicker') tk.geometry("1500x800") def nplus(): global n n = round((n + z),3) label1['text'] = str(n) + '$' def nsbros(): global n global z global count n = 0 z = 0.1 count = 0.4 label1['text'] = str(n) + '$' label2['text'] = 'За клик: ' + str(round(z, 3)) + '$' label3['text'] = 'Стоимость улучшения: ' + str(round(count, 3)) + '$' def dopclick(): global n global z global count if n >= count: n = round((n - count),3) z = z + z/4 count = z * 4 label1['text'] = str(n) + '$' label2['text'] = 'За клик: ' + str(round(z,3)) + '$' label3['text'] = 'Стоимость улучшения: ' + str(round(count, 3)) + '$' label1 = Label(tk, text=str(round(n,3))+'$', font=('Helvetica 100')) label1.pack() label2 = Label(tk, text='За клик: '+str(round(z,3))+'$', font=('Helvetica 30')) label2.pack() label3 = Label(tk, text='Стоимость улучшения: '+str(round(count,3))+'$', font=('Helvetica 30')) label3.pack() btn1 = Button(text="Клик", background="#000", foreground="#fff", padx="60", pady="30", font="Helvetica 50", command=nplus) btn1.pack() label4 = Label(tk, text='', font=('Helvetica 30')) label4.pack() btn3 = Button(text="Улучшение", background="#000", foreground="#fff", padx="60", pady="10", font="Helvetica 25", command=dopclick) btn3.pack() label5 = Label(tk, text='', font=('Helvetica 30')) label5.pack() btn2 = Button(text="Сброс", background="#000", foreground="#fff", padx="20", pady="8", font="16", command=nsbros) btn2.pack() mainloop() f = open('rezults.txt', "w") f.write(str(n) + '\n') f.write(str(z) + '\n') f.write(str(count) + '\n') f.close()
КАК СОЗДАТЬ ИГРУ КЛИКЕР НА PYTHON
В общем, давно играл в такую игру как "Red egg- красное яйцо" суть той игры в том что нужно жать на экран и тебе сверху над яйцом пишет текст после каждого нажатия. И там всегда разный текст. Интересно просто как и на каком языке программирования эта игра делалась?
Голосование за лучший ответ
Научись программированию и создай
Очень лёгкая по#бень
Максим КулиничУченик (104) 2 года назад
Она делается как бот для вк? Тоесть просто print ("text") и иногда задавать вопросы?
не, типо через библиотеку tkinter
вот тебе код
from tkinter import *
clicks = 0
def click_button():
global clicks
clicks += 1
button.config(text="Нажатий <>".format(clicks))
button = Button(text="Нажатий 0", bg="#555", fg="#ccc", font=16, command=click_button)
button.place(relx=.5, rely=.5, anchor="c")
root.mainloop()
Я создал кликер на Python (Tkinter)
Всем привет! В этом блоге я бы хотел рассказать как я создавал свой кликер на Python.
Идея у меня пришла спонтано. Я сидел изучал Canvas, и я подумал "А может мне свой кликер создать?" И я начал разработку.
P.s Я не всё запомнил в процессе разработки, и поэтому могут быть некоторые пробелы.
- 1 День 1-2
- 2 День 3
- 2.1 Компактизация и оформление кода
День 1-2 [ ]
В начале я написал программу которая создавала кнопку, при нажатии которой переменная money увеличивалась на 1.
from tkinter import * root = Tk() def click(): money += 1 print(money) click_button = Button(text='Touch me!', command=click) click_button.pack() root.mainloop()
И тут я столкнулся с ошибкой " UnboundLocalError: local variable 'money' referenced before assignment" . Я попытался что-то сделать, но не получилось, и поэтому я пошёл в гугл с этим вопросом, и там я нашёл вопрос на свой ответ!
from tkinter import * root = Tk() money = 0 def click(): global money money += 1 print(money) click_button = Button(text='Touch me!', command=click) click_button.pack() root.mainloop()
Теперь мне надо было создать кнопку которая улучшала бы количество валюты за клик, ну и чтобы выводилось количество валюты не в терминале а в окне.
from tkinter import * root = Tk() money = 0; upgrading = 0 label = Label() label.pack() def click(): global money money += upgrading label['text'] = money click_button = Button(text='Touch me!', command=click) click_button.pack() def upgrade_click(): global money; global upgrading if money >= 20: money -= 20 upgrading += 1 else: label['text'] = f'money> | Недостаточно денег!' upgrade_button = Button(text='Click +1', command=upgrade_click) upgrade_button.pack() root.mainloop()
. Да, мне захотелось "основные" переменные и global'ы писать через точку с запятой. И тут возникла ошибка: количество валюты не увеличивалось. Но добавив global upgrading и изменив значение upgrading на 1 всё исправилось. Следующей задачей над которой мне действительно пришлось попотеть и даже сделать перерыв - количество денег в секунду. Изначально я попробовал через time.
from tkinter import * import time root = Tk() money = 0; upgrading = 20; mps_val = 1
def mps(): time.sleep(1) money += mps_val mps_button = Button(text='mps 50', command=mps) mps_button.pack()
Очевидно что вызывалась ошибка. Я делал global'ы, пробовал делать while циклы внутри и вне функций, но что бы я не делал ничего нормально не работало и тогда я решил обратится в гугл и там я нашёл пример с ежесекудным обновлением времени. Тогда я понял что надо делать.
from tkinter import * root = Tk() money = 0; upgrading = 1; mps_val = 0; game_time = 0 label = Label() label.pack() def click(): global money; global upgrading money += upgrading label['text'] = f'money> | mps_val>' Button(text='Touch me!', command=click).pack() def upgrade_click(): global money; global upgrading if money >= 20: money -= 20 upgrading += 1 else: label['text'] = f'money> | Недостаточно денег!' Button(text='Click +1', command=upgrade_click).pack() def mps(): global money; global mps_val if money >= 50: money -= 50 mps_val += 1 label['text'] = f'money> | mps_val>' else: label['text'] = f'money> | Недостаточно денег!' Button(text='mps +1', command=mps).pack() lab = Label() lab.pack(anchor=CENTER, side=BOTTOM) def every_second_event(): global game_time; global money; global mps_val game_time += 1 game_time = round(game_time, 2) lab['text'] = f'You play game_time> seconds' money += mps_val money = round(money, 1); mps_val = round(mps_val, 1) # Fix ".00000000" bug label['text'] = f'money> | mps_val>' root.after(1000, every_second_event) every_second_event() root.mainloop()
Я сделал событие которое будет происходить каждую секунду. Да, я решил сделать текст который будет показывать сколько проведено времени в игре. Однако у меня возникла какая-то ошибка. У меня были проблемы с выводом денег. В этом коде ошибки нет, а в текущем я сделал недоисправление где разделил все значения на 10 и в root.after я сделал событие каждые 100 миллисекунд. Далее я подумал над престижем, но перед этим я решил сделать систему сохранений и кол-во покупаемой валюты в зависимости от выбраной кнопки (их у меня 3: x1, x10, x100). С количеством покупки у меня возникли небольшие проблемы но быстро исправил. Сохранения - я создал файл data.py . В нём хранились данные об игре. Также я решил сделать сокращения k, m, и b в коде.
# Файл data.py. Если что этого комментария нет в самом файле. money_data = 214.6 upgrading_data = 88.0 mps_data = 3.4 game_time_data = 65.6
from tkinter import * from data import * root = Tk() money = money_data; upgrading = upgrading_data; mps_val = mps_data; game_time = game_time_data frame = Frame() frame.pack() label = Label(frame, text=f'Balance: money> | Money Per Click: upgrading> | Money Per Second: mps_val * 10>') label.pack(side=TOP) err_label = Label() err_label.pack(side=TOP) buy_quantity = 1 def buy_quantity_x1(): global buy_quantity buy_quantity = 1 def buy_quantity_x10(): global buy_quantity buy_quantity = 10 def buy_quantity_x100(): global buy_quantity buy_quantity = 100 Button(frame, text='x1', command=buy_quantity_x1).pack(side=LEFT) Button(frame, text='x10', command=buy_quantity_x10).pack(side=LEFT) Button(frame, text='x100', command=buy_quantity_x100).pack(side=LEFT) def click(): global money; global upgrading; global money_txt money += upgrading money_txt = money #Reductions k, m, b ceil = lambda num: round(money_txt / num, 1) if money_txt >= 1e9: money_txt = f'ceil(1e9)>b' elif money_txt >= 1e6: money_txt = f'ceil(1e6)>m' elif money_txt >= 1e3: money_txt = f'ceil(1e3)>k' else: pass label['text'] = f'Balance: money_txt> | Money Per Click: upgrading> | Money Per Second: mps_val * 10>' Button(frame, text='Touch me!', command=click).pack(anchor=CENTER, side=LEFT) def upgrade_click(): global money; global upgrading if money >= 20.0 * buy_quantity: money -= 20.0 * buy_quantity upgrading += 1.0 * buy_quantity else: pass Button(frame, text='Click +1', command=upgrade_click).pack(anchor=CENTER, side=LEFT) # mps = money per second def mps(): global money; global mps_val; global money_txt if money >= 50.0 * buy_quantity: money -= 50.0 * buy_quantity mps_val += 0.1 * buy_quantity label['text'] = f'Balance: money_txt> | Money Per Click: upgrading> | Money Per Second: mps_val * 10>' else: pass Button(frame, text='mps +1', command=mps).pack(anchor=CENTER, side=LEFT) lab = Label() lab.pack(anchor=CENTER, side=BOTTOM) # def prestige(): # if money >= 1e5: def every_second_event(): global game_time; global money; global mps_val; game_time += 0.1 game_time = round(game_time, 2) lab['text'] = f'You play game_time> seconds' money += mps_val money = round(money, 1); mps_val = round(mps_val, 1) # Fix ".00000000" bug money_txt = money #Reductions k, m, b if money_txt >= 1e9: money_txt = f'round(money_txt / 1e9, 1)>b' elif money_txt >= 1e6: money_txt = f'round(money_txt / 1e6, 1)>m' elif money_txt >= 1e3: money_txt = f'round(money_txt / 1e3, 1)>k' else: pass label['text'] = f'Balance: money_txt> | Money Per Click: upgrading> | Money Per Second: mps_val * 10>' root.after(100, every_second_event) every_second_event() def save(): file = open('data.py', 'w') file.write(f'money_data = money>\nupgrading_data = upgrading>\nmps_data = mps_val>\ngame_time_data = game_time>\n# Every data in code multiplicate on 10') Button(frame, text='Save', command=save).pack(side=LEFT) root.mainloop()
День 3 [ ]
Первую половину дня я посвятил написанию этого блога. Привет мне из будущего!
Я решил всё же реализовать престиж и после этого занятся оформлением кода.
def prestige(): global money; global upgrading; global mps_val; global prestige_bonus if money >= 1e6: prestige_bonus = 1 + (money / 1e7) money = 0 upgrading = 1 mps_val = 0 else: pass Button(text='Prestige', command=prestige).pack()
def save(): file = open('data.py', 'w') file.write(f'''money_data = money> upgrading_data = upgrading> mps_data = mps_val> game_time_data = game_time> prestige_bonus_data = prestige_bonus> # Every data in code multiplicate on 10''') Button(frame, text='Save', command=save).pack(side=LEFT)
С третьей попытки всё заработало. В первой была ошибка в save, вторая с global'амы.
После того как я добавил бонусы престижа в код, я не учёл что изначально в upgrading в label'е будет отображаться изначально как 1 а не с бонусом сразу. На это я подзабил, но я не мог подзабить на ещё один баг: баг с плавающей точкой у MPS и кол-во денег за клик. С кликами я решил баг, а клики в секунду почему-то не исправлялись. В чём дело не понятно, код с upgrading_click() практически идентичен, ну и я решил также подзабить на это.
Теперь надо будет заняться оформлением и компактизацией кода.
Компактизация и оформление кода [ ]
from tkinter import * from data import * root = Tk() money = money_data; upgrading = upgrading_data; mps_val = mps_data; game_time = game_time_data; prestige_bonus = prestige_bonus_data frame = Frame() frame.pack() label = Label(frame, text=f'Balance: money> | Money Per Click: upgrading> | Money Per Second: mps_val * 10> | Prestige bonus: prestige_bonus>') label.pack(side=TOP) err_label = Label() err_label.pack(side=TOP) buy_quantity = 1 def buy_quantity_x1(): global buy_quantity buy_quantity = 1 def buy_quantity_x10(): global buy_quantity buy_quantity = 10 def buy_quantity_x100(): global buy_quantity buy_quantity = 100 Button(frame, text='x1', command=buy_quantity_x1).pack(side=LEFT) Button(frame, text='x10', command=buy_quantity_x10).pack(side=LEFT) Button(frame, text='x100', command=buy_quantity_x100).pack(side=LEFT) fix = lambda var: round(var, 2) def click(): global money; global upgrading; global money_txt money += upgrading * prestige_bonus money_txt = money #Reductions k, m, b ceil = lambda num: round(money_txt / num, 1) if money_txt >= 1e9: money_txt = f'ceil(1e9)>b' elif money_txt >= 1e6: money_txt = f'ceil(1e6)>m' elif money_txt >= 1e3: money_txt = f'ceil(1e3)>k' else: pass label['text'] = f'Balance: money_txt> | Money Per Click: upgrading> | Money Per Second: mps_val * 10> | Prestige bonus: prestige_bonus>' Button(frame, text='Touch me!', command=click).pack(anchor=CENTER, side=LEFT) def upgrade_click(): global money; global upgrading if money >= 20.0 * buy_quantity: money -= 20.0 * buy_quantity upgrading += 1.0 * buy_quantity * prestige_bonus upgrading = fix(upgrading) label['text'] = f'Balance: money_txt> | Money Per Click: upgrading> | Money Per Second: mps_val * 10> | Prestige bonus: prestige_bonus>' else: pass Button(frame, text='Click +1', command=upgrade_click).pack(anchor=CENTER, side=LEFT) # mps = money per second def mps(): global money; global mps_val; global money_txt if money >= 50.0 * buy_quantity: money -= 50.0 * buy_quantity mps_val += 0.1 * buy_quantity * prestige_bonus mps_val = fix(mps_val) label['text'] = f'Balance: money_txt> | Money Per Click: upgrading> | Money Per Second: mps_val * 10> | Prestige bonus: prestige_bonus>' else: pass Button(frame, text='mps +1', command=mps).pack(anchor=CENTER, side=LEFT) lab = Label() lab.pack(anchor=CENTER, side=BOTTOM) def prestige(): global money; global upgrading; global mps_val; global prestige_bonus if money >= 1e6: prestige_bonus = 1 + (money / 1e7) money = 0 upgrading = 1 mps_val = 0 else: pass Button(text='Prestige', command=prestige).pack() def every_second_event(): global game_time; global upgrading; global money; global mps_val game_time += 0.1 game_time = round(game_time, 2) lab['text'] = f'You play game_time> seconds' money += mps_val # Fixing ".00000000" bug money = fix(money) upgrading = fix(upgrading) mps_val = fix(mps_val) money_txt = money #Reductions k, m, b if money_txt >= 1e9: money_txt = f'round(money_txt / 1e9, 1)>b' elif money_txt >= 1e6: money_txt = f'round(money_txt / 1e6, 1)>m' elif money_txt >= 1e3: money_txt = f'round(money_txt / 1e3, 1)>k' else: pass label['text'] = f'Balance: money_txt> | Money Per Click: upgrading> | Money Per Second: mps_val * 10> | Prestige bonus: prestige_bonus>' root.after(100, every_second_event) every_second_event() def save(): file = open('data.py', 'w') file.write(f'''money_data = money> upgrading_data = upgrading> mps_data = mps_val> game_time_data = game_time> prestige_bonus_data = prestige_bonus> # Every data in code multiplicate on 10''') Button(frame, text='Save', command=save).pack(side=LEFT) root.mainloop()
Первое что бросается в глаза это постояное повторение f'Balance: | Money Per Click: | Money Per Second: | Prestige bonus: ' . Я думал что просто создам переменную, но всё слетело к фигам собачим и ничего не работало. Добавил global'ы - не работало.
Убрав f я понял в чём проблема. Заданные значения сохраняются и не хотят обновляться. Я не понимал как это исправить. Я столько всякой фигни поиспробывал, но ничего не помогало (даже гугл). В итоге это стало третьей вещью над которой я положил хрен.
А после того как я решил оставить этот повторяющийся текст и запустить игру, спустя второго престижа после любого клика на милисекунду вылизал тот баг с милисекундой. После этого я решил отложить этот проект на неопределённое время.
День 4 (6 с начала проекта) [ ]
Спустя три дня я решил вернуться к проекту. За это время я уже изучил основы SQLite и начал изучать библиотеку sqlite3. Я догадался что в коде можно сначала сделать самые простые сокращения, но после небольших изменений оказалось что вылезало два окна и при закрытии одного из них вылезала ошибка. Это было не критично, но всё же не очень. Посмотрев на свою последнюю версию кода в третий день разработки я переставил переменную root на третье место и всё заработало нормально.
Далее баг второго престижа. Он был тоже не критичен, но так сильно бесил. Я решил что стоит округлять бонус престижа до десятых.
Также до меня дошло что money и money_data ничем не отличаются и поэтому переменные в файле "data.py" я назвал также как и переменные в основном файле.
Смотря на код, до меня внезапно дошло что код функций upgrade_click() и mps() практически ничем не отличается, и я создал функцию some_upgrade()
Когда я запустил код с новой функцией, то я заметил что money_txt появляется только после нажатия по кнопке клика. Но ещё улучшения не прибавлялись. Со вторым было понятно что действия происходят со значением value а не с переменной. Но чтобы полностью убедиться я заменил в функции выражения с value на upgrading и всё как полагалось. И на этот момент времени что наступил пятый день. Ну пофигу, допишу в четвёртом дне то что я хотел сделать.
В общем, из выражений с value я сделал переменую some_value . Однако всё не так просто (опять!), мне пришлось добавить if elif в код и туповатый ведь при новом улучшении мне придётся переписывать some_upgrade() , но лучше чем ничего. Пожалуй покажу код а то говорю говорю и ничего не показываю.
def some_upgrade(float1, value, float2): global money; global money_txt; global upgrading; global mps_val if money >= float1 * buy_quantity: money -= float1 * buy_quantity if value == upgrading: upgrading += float2 * buy_quantity * prestige_bonus upgrading = fix(upgrading) elif value == mps_val: mps_val += float2 * buy_quantity * prestige_bonus mps_val = fix(mps_val) label['text'] = f'Balance: money_txt> | Money Per Click: upgrading> | Money Per Second: mps_val * 10> | Prestige bonus: prestige_bonus>' else: pass def upgrade_click(): global money; global upgrading; global money_txt some_upgrade(20.0, upgrading, 1.0) Button(frame, text='Click +1', command=upgrade_click).pack(anchor=CENTER, side=LEFT) # mps = money per second def mps(): global money; global mps_val; global money_txt some_upgrade(50.0, mps_val, 0.1) Button(frame, text='mps +1', command=mps).pack(anchor=CENTER, side=LEFT)
Да, там лишь часть, но надо скидывать почти весь код чтобы показать все изменения. Могу сказать что в нём сейчас 123 строки.
Итак, у меня осталось из проблем:
- money_txt появляется только после клика по одноимённой кнопке.
- Повторение f'Balance: | Money Per Click: | Money Per Second: | Prestige bonus: '
- "Баг .00000"
Всех их я конечно решу в пятый день. Надеюсь.
День 5 (7 с нач. пр.) [ ]
Я решил просто поиграть в игру, и тут я понял что мне нужно как-то сделать ресет данных. Это удалось мне легко.
def reset(): cmd = input('You want reset data? ("yes" or "no") ') cmd = cmd.lower() if cmd == 'yes': file = open('data.py', 'w') file.write(f'''money = 0.0 upgrading = 1.0 mps_val = 0.0 game_time = 0.0 prestige_bonus = 1.0 # mps_val multiplies on 10 ''') print('After close all data will be erased.') else: pass Button(frame, text='Reset', command=reset).pack(side=LEFT)
Также я сделал так чтобы у игрового времени не было исчисления в десятых секундах а также добавил сокращение до минут и часов. Для этого мне пришлось создать отдельную переменную для исправления не только бага ".00000", а чтобы ещё работало оно нормально.
def every_second_event(): global game_time; global upgrading; global money; global mps_val game_time += 0.1; gt_fix = game_time time_reductions = '' if game_time >= 3600.0: gt_fix = round(game_time / 3600) time_reductions = f'You play gt_fix> hours' elif game_time >= 60.0: gt_fix = round(game_time / 60) time_reductions = f'You play gt_fix> minutes' else: gt_fix = round(game_time) time_reductions = f'You play gt_fix> seconds' lab['text'] = time_reductions
Спустя некоторое время я понял чтобонус престижа не влияет на mps, что было непонятно ведь с upgrading проблем не было. Возможно это было из-за того что изначальное значение mps_val в 10 раз меньше показываемого. Я подумал что стоит заменить это на обычное число, но это не помогло и пишлось бы копаться в коде чтобы всё это переделать. Я решил сделать перерыв :/