2015-08-09 3 views
0

Я работаю над кодом, который является игрой для кликера. Я сделал 90% себя, так как я никогда не использовал модуль Tkinter раньше, так как был действительно учебным проектом, так или иначе:Tkinter update label при изменении переменной

Я только что отсортировал функцию автоматического нажатия и метку в окне, прикрепленном к переменной (количество наличных денег), на данный момент у меня есть метка в .pack() и устанавливается так, что она создает новую метку после каждой секунды. Очевидно, что это создаст путаницу, и это не то, что вы ожидаете от игры, поэтому я задавался вопросом, есть ли способ:

1) Обновляйте ярлык каждый раз, когда изменяется переменная (количество наличных денег) (это было бы идеально, если вы можете мне помочь)

2) Удалите метку строкой кода, а затем введите новую метку с текущим номером переменных (не так хорошо, как первый, но все равно будет отлично чтобы это один, если первый не представляется возможным)

Вот код до сих пор:

import time 
from tkinter import * 
root=Tk() 

CPS=0 
cash=0 
mult=1 

def blankLine(): 
    for i in range(16): 
     print ("") 

def infoprint(): 
    print("Cash =",cash) 
    print("") 
    print("Each click is worth",mult,"cash") 
    print("") 
    print("CPS =",CPS) 
    blankLine() 

def CashASecond(): 
    global root 
    global cash 
    global CPS 
    cash += CPS 
    root.after(1000, CashASecond) 
CashASecond() 

def CashLabel(): 
    label1=Label(root,text=cash) 
    label1.pack() 
    root.after(1000, CashLabel) 
CashLabel() 

def ManualClicker(): 
    global cash 
    global mult 
    cash += 1*(mult) 
    infoprint() 
ManualClickerButton=Button(root,text="Click",command=ManualClicker) 
ManualClickerButton.pack() 

class upgrades(): 
    def DoubleManualClicker(): 
     global cash 
     global mult 
     if cash < 1000: 
      print("Not enough cash, sorry") 
     elif cash>= 1000: 
      print ("Double clicks purchased!") 
      mult *= 2 
      cash = cash - 1,000 
    DoubleManualClickerButton=Button(root,text="Purchase double clicks",command=DoubleManualClicker) 
    DoubleManualClickerButton.pack() 
    DoubleManualClickerLabel=Label(root,text="Each click is worth twice as much, costs 1,000 \n") 
    DoubleManualClickerLabel.pack() 

    def clicker(): 
     global cash 
     global mult 
     global CPS 
     if cash < 25: 
      print("Not enough cash, sorry") 
     elif cash >=25: 
      CPS += 1 
      print("CPS is now",CPS) 
      cash = cash - 25 
    ClickerButton=Button(root,text="Purchase auto clicker", command=clicker) 
    ClickerButton.pack() 
    ClickerLabel=Label(root,text="+1 CPS, costs 25 \n") 
    ClickerLabel.pack() 

    def SingleMachine(): 
     global cash 
     global mult 
     global CPS 
     if cash < 50: 
      print("Not enough cash, sorry") 
     elif cash >= 50: 
      CPS += 3 
      print("CPS is now",CPS) 
      cash = cash - 50 
    SingleMachineButton=Button(root,text="Purcahse Single Cash Printer",command=SingleMachine) 
    SingleMachineButton.pack() 
    SingleMachineLabel=Label(root,text="+3 CPS, costs 50 \n") 
    SingleMachineLabel.pack() 

    def LoftOfCashPrinter(): 
     global cash 
     global mult 
     global CPS 
     if cash < 100: 
      print("Not enough cash, sorry") 
     elif cash >= 100: 
      CPS += 5 
      print("CPS is now",CPS) 
      cash=cash-100 
    LoftOfCashPrinterButton=Button(root,text="Purchase a loft of cash printers",command=LoftOfCashPrinter) 
    LoftOfCashPrinterButton.pack() 
    loftlabel=Label(root,text="+7 CPS, costs 100 \n") 
    loftlabel.pack() 


root.title("Cash Clicker! ALPHA! By George Hill") 
root.geometry("500x900+900+0") 

root.mainloop() 

Заранее спасибо :)

+0

Я думаю, что это то, что вы ищете: [Stringvar in Tkinter] (http://effbot.org/tkinterbook/variable.htm) использует 'textvariable'-option вашего' label' для связывания Stringvar. Теперь вы можете изменить свой stringvar, и ваш ярлык автоматически изменится. – VRage

ответ

0

У меня была эта проблема раньше и как мне удалось это исправить, чтобы использовать события и привязки. Обратите внимание, что я использую классы и приложение. например

def Click(self, event): 
    self.Label['text'] = .... 

.... 
    self.Buy = Button(....) 
    self.Buy.grid(....) 
    self.Buy.bind('<Button>', self.Click) 

    self.Label = Label(....) 
    self.Label.grid(....) 

Я понимаю, что этот код очень простой (он не будет работать) и использование .... чтобы показать, где будет использоваться использование переменных и тому подобное. Это написано исключительно для того, чтобы показать вам, как привязывать виджеты.

+0

1) 'self.Label' - это плохое имя IMHO. 'self.BuyLabel' или' self.LabelForBuyButton' лучше. 2) Вам не нужно 'bind',' command = 'отлично. –

+0

Эй, спасибо за ответ, но я не совсем понимаю, что на самом деле делает этот код. Насколько я понимаю, он делает то же, что и мой текущий код. Для меня это говорит о том, что при нажатии кнопки он делает новую метку, которая не то, что я хочу –

+0

Взгляните на этот [сайт] (http://www.python-course.eu/tkinter_events_binds.php), он дает вам полный список ВСЕХ привязок, доступных для использования, таких как нажатия клавиш и движение мыши. – Ghrafkly