在tkinter python 3中,从稍后创建的另一个类的实例更新已创建的类实例的属性值

2024-09-29 02:24:37 发布

您现在位置:Python中文网/ 问答频道 /正文

维护策略.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()

菜单命令.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()

我想将一个文件中某个实例的attribute值从另一个已经创建的文件中的另一个类的实例更改为另一个。 在MenubarComman.py文件中更改默认播放器名称时,我希望从MainTicTacToe.py类中访问更改后的名称。我该怎么做?
我是Python的新手

提前谢谢


Tags: pyselfinitdefrootframecommandtk
1条回答
网友
1楼 · 发布于 2024-09-29 02:24:37

你的问题源于Tk()的两个实例和草率的编程,即有时你使用parent,有时使用self.parnt,这是一个不好的习惯,所以一切都更改为self.top,这样如果这两个实例中的任何一个仍然存在,就会弹出一个错误。。当PlayerSetting()完成时,还必须有一种方法发出信号。就程序的结构而言,我所知的唯一方法就是使用递归检查“活动的”。您还可以让PlayerSettings在完成时调用Game()中的函数,该函数将打印值。我已经清理了你的代码,它的工作,我认为它应该。。请注意,这两个类位于同一个文件中,以便在此处进行测试和发布

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()

相关问题 更多 >