2

I'm having some problems with the global variables:

#Dev by Mkee
import Tkinter as tk
import sys, random
globvar = 0
class Shuffle(object):
    def __init__(self,master=None):
        self.master=master
        self.text=tk.Label(master, text="Type in something:")
        self.box=tk.Entry(master)
        self.buttn = tk.Button(master, text="Done", width=10, command=self.calc())
        self.result = tk.Label(self.master, text=globvar)
    def hide(self):
        self.text.pack_forget()
        self.box.pack_forget()
        self.buttn.pack_forget()
        self.result.pack_forget()
    def show(self):
        self.text.pack(padx=2, pady=2)
        self.box.focus_set()
        self.box.pack(side=tk.TOP, padx=3, pady=3)
        self.buttn.pack(side=tk.TOP, padx=3, pady=3)
        self.result.pack(side=tk.TOP, padx=3, pady=3)
    def calc(self):
        word = self.box.get()
        while len(word) != 0:
            i = random.randrange(0, len(word))
            global globvar
            globvar = word[i] 
            word = word[0:i] + word[i+1:]


class MainApp(object):
    def __init__(self,master=None):
        self.master=master
        app=self.app=tk.Tk()
        app.title("Mkee's Tools")
        app.geometry('500x500')
        menubar=tk.Menu(app)
        self.shuffle=Shuffle(master)
        self.current=self.shuffle
        program_menu=tk.Menu(menubar)
        program_menu.add_command(label='Shuffle',command=self.show_shuffle)
        menubar.add_cascade(label='Programs', menu=program_menu)
        app.config(menu=menubar)
    def show_shuffle(self):
        self.current.hide()
        self.current=self.shuffle
        self.shuffle.show()
    def show_buttons(self):
        self.current.hide()
        self.current=self.buttons        
        self.buttons.show()

def main():
    m=MainApp()
    m.app.mainloop()

if __name__=='__main__':
    main()

I get the problem when I click the buttonself.buttn = tk.Button(master, text="Done", width=10, command=self.calc()). I want to make the self.result = tk.Label(self.master, text=globvar) show the globvar taken from calc, but instead it shows the globvar that is set before the classglobvar = 0. What am I doing wrong?

Thurax
  • 77
  • 2
  • 6

1 Answers1

4
  1. To make the Label update, set textvariable=self.globvar, where self.globvar = tk.StringVar(). The Label text is updated by calling self.globvar.set.
  2. Change command=self.calc() to command=self.calc (without parentheses). With parentheses, self.calc() is called at the time self.buttn is defined. And command gets set to the return value of self.calc(), which is None. Nothing happens when the button is pressed because command equals None. Without parentheses, command is set to the function object self.calc, and the function is called (correctly) whenever the button is pressed.
  3. Try to avoid using global variables. It will help Shuffle to be self-contained, more easily reusable and importable.

import Tkinter as tk
import sys, random

class Shuffle(object):
    def __init__(self,master=None):
        self.master=master
        self.text=tk.Label(master, text="Type in something:")
        self.box=tk.Entry(master)
        self.buttn = tk.Button(master, text="Done", width=10, command=self.calc)
        self.globvar = tk.StringVar()
        self.globvar.set(0)
        self.result = tk.Label(self.master, textvariable=self.globvar)
    def hide(self):
        self.text.pack_forget()
        self.box.pack_forget()
        self.buttn.pack_forget()
        self.result.pack_forget()
    def show(self):
        self.text.pack(padx=2, pady=2)
        self.box.focus_set()
        self.box.pack(side=tk.TOP, padx=3, pady=3)
        self.buttn.pack(side=tk.TOP, padx=3, pady=3)
        self.result.pack(side=tk.TOP, padx=3, pady=3)
    def calc(self):
        word = self.box.get()
        while len(word) != 0:
            i = random.randrange(0, len(word))
            self.globvar.set(word[i])
            word = word[0:i] + word[i+1:]

class MainApp(object):
    def __init__(self,master=None):
        self.master=master
        app=self.app=tk.Tk()
        app.title("Mkee's Tools")
        app.geometry('500x500')
        menubar=tk.Menu(app)
        self.shuffle=Shuffle(master)
        self.current=self.shuffle
        program_menu=tk.Menu(menubar)
        program_menu.add_command(label='Shuffle',command=self.show_shuffle)
        menubar.add_cascade(label='Programs', menu=program_menu)
        app.config(menu=menubar)
    def show_shuffle(self):
        self.current.hide()
        self.current=self.shuffle
        self.shuffle.show()
    def show_buttons(self):
        self.current.hide()
        self.current=self.buttons        
        self.buttons.show()

def main():
    m=MainApp()
    m.app.mainloop()

if __name__=='__main__':
    main()
unutbu
  • 842,883
  • 184
  • 1,785
  • 1,677