【问题标题】:Updating value of attribute of a created instance of a class from an instance of another class created later, in tkinter python 3在 tkinter python 3 中,从稍后创建的另一个类的实例更新一个类的创建实例的属性值
【发布时间】:2018-08-25 18:19:03
【问题描述】:

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

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

提前致谢。

【问题讨论】:

    标签: python oop user-interface tkinter


    【解决方案1】:

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

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

    【讨论】:

    • 游戏类的get_variable()没有输出
    • 它打印到我系统上的控制台。您必须自己做一些工作来调试并找出原因,因为它在这里有效。
    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2015-01-01
    • 2023-04-02
    相关资源
    最近更新 更多