简体   繁体   中英

Updating value of attribute of a created instance of a class from an instance of another class created later, in tkinter python 3

MainTicTacToe.py

import tkinter as tk

import MenubarCommand as mbc

class Game(tk.Frame):

    def __init__(self,parent):
        tk.Frame.__init__(self,parent)

        self.parnt=parent
        # self.parnt.geometry('500x300')
        self.parnt.title("Tic Tac Toe")
        # self.pack()

        menubar=tk.Menu(parent)
        # 'settings' menu
        settingsOption=tk.Menu(menubar, tearoff=0)
        settingsOption.add_command(label='Player Settings', command=self.doit)
        settingsOption.add_command(label='Board Settins', command=self.doit)
        menubar.add_cascade(label='Setings', menu=settingsOption)

        # without using this method, menubar isn't shown in Frame
        self.parnt.config(menu=menubar)


    def doit(self):
        root=self.win()
        set=mbc.playerSettings(root)
        # print(set.p1name)
        root.mainloop()



    def win(self):
        return tk.Tk()

def main():
    root=tk.Tk()
    Game(root)
    root.mainloop()

main()

MenubarCommand.py

import tkinter as tk

class playerSettings(tk.Frame):
    def __init__(self,parent=tk.Frame):
        tk.Frame.__init__(self,parent)

        self.parnt=parent
        self.parnt.title("Player Setting")

        self.p1name='Player 1'
        self.p2name='Player 2'
        self.p1symbol='x'
        self.p2symbol='o'

        # **********************************#
        self.p1NameLabel = tk.Label(parent, text='Player 1: Name ')
        self.p1NameLabel.grid(row=0, column=0)
        self.p1NameEntry = tk.Entry(parent)
        self.p1NameEntry.insert(0,self.p1name)
        self.p1NameEntry.bind('<FocusIn>', lambda event:self.p1NameEntry.delete(0,'end'))
        self.p1NameEntry.grid(row=0, column=1)


        apply=tk.Button(parent, text="Apply Settings", fg='white', bg='gray', command=self.saveStat)
        apply.grid(row=2, rowspan=1, columnspan=4)


    def saveStat(self):
        print('Settings Window Destroyed')
        self.p1name=self.p1NameEntry.get()
        print(self.p1name)
        self.parnt.destroy()

I want to change the value of attribute of an instance in one file from the instance of another class in another file already created. When I change default Player name in MenubarComman.py file, I want to access the changed name from MainTicTacToe.py class. How can I do this?
I'm new new in Python.

Thanks in Advance.

You problems stem from 2 instances of Tk(), and sloppy programming, ie sometimes you use parent, and sometimes self.parnt which is a bad habit to get into, so everything is changed to self.top so an error will pop up if any of those two remains.. You also have to have a way to signal when PlayerSetting() is finished. The way the program is structured, the only way that I know of is to check for "alive" using recursion. You could also have PlayerSettings call a function in Game() when finished, which would print the value. I have cleaned up your code and it works as I understand it should.. Note that the 2 classes are in the same file to make it easier to test and post here.

import tkinter as tk

##import MenubarCommand as mbc

class Game():
    def __init__(self,parent):

        self.parnt=parent
        # self.parnt.geometry('500x300')
        self.parnt.title("Tic Tac Toe")
        # self.pack()

        menubar=tk.Menu(parent)
        # 'settings' menu
        settingsOption=tk.Menu(menubar, tearoff=0, bg="yellow")
        settingsOption.add_command(label='Player Settings', command=self.doit)
        settingsOption.add_command(label='Board Settins', command=self.doit)
        menubar.add_cascade(label='Setings', menu=settingsOption)

        # without using this method, menubar isn't shown in Frame
        self.parnt.config(menu=menubar)


    def doit(self):
        ## do not open more than one Tk() instance
        ##root=self.win()
        self.top=tk.Toplevel(self.parnt)
        self.set_it=PlayerSettings(self.top)
        self.get_variable()
        ##root.mainloop()


    def get_variable(self):
        """ check continuously if PlayerSettings has exited and
            if so, get the Entry's value
        """
        if self.set_it:
            self.parnt.after(1000,  self.get_variable)
        else:
            print("from Game", self.set_it.p1name)

    def win(self):
        return tk.Tk()


class PlayerSettings():
    def __init__(self, parent):
        self.top=parent

        self.p1name='Player 1'
        self.p2name='Player 2'
        self.p1symbol='x'
        self.p2symbol='o'

        # **********************************#
        self.p1NameLabel = tk.Label(self.top, text='Player 1: Name ', bg="lightblue")
        self.p1NameLabel.grid(row=0, column=0)
        self.p1NameEntry = tk.Entry(self.top)
        self.p1NameEntry.focus_set()
        self.p1NameEntry.insert(0,self.p1name)
        ##self.p1NameEntry.bind('<FocusIn>', lambda event:self.p1NameEntry.delete(0,'end'))
        self.p1NameEntry.grid(row=0, column=1, sticky="nsew")


        apply=tk.Button(self.top, text="Apply Settings", fg='white', bg='gray', command=self.saveStat)
        apply.grid(row=2, rowspan=1, columnspan=4)

    def saveStat(self):
        self.p1name=self.p1NameEntry.get()
        print(self.p1name)
        print('Settings Window Destroyed')
        self.top.destroy()

root=tk.Tk()
Game(root)
root.mainloop()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM