首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tkinter问题-继承问题

Tkinter问题-继承问题
EN

Stack Overflow用户
提问于 2020-10-13 00:39:50
回答 2查看 34关注 0票数 0

我开始使用Tkinter应用程序来处理类,但我似乎不理解类是如何工作的,尤其是父级与控制器之间的关系。正如您在下面的代码中所看到的,我计划为整个部分创建一个外部类,然后为该框架内的每个部分创建4个内部类。但是,我不能从初始框架调用这些类。有没有更好的方法来做到这一点?我到底做错了什么?

代码语言:javascript
复制
class MainScreenFrameCenter(tk.Frame):
    def __init__(self, parent, controller,*args,**kwargs):
        tk.Frame.__init__(self,parent, bg="white",height=680, width=640,highlightbackground="black", highlightthickness=1)
        self.controller = controller
        self.pack(side="top",  fill="both", expand=True)

        self.widgets_nw = MainScreenFrameCenterNW(parent=self,controller=self)
        self.widgets_sw = MainScreenFrameCenterSW(parent=self,controller=self)
        self.widgets_ne = MainScreenFrameCenterNE(parent=self,controller=self)
        self.widgets_se = MainScreenFrameCenterSE(parent=self,controller=self)

    class MainScreenFrameCenterNW(tk.Frame):
        def __init__(self, parent, controller,*args,**kwargs):
            tk.Frame.__init__(self,parent,height=350,width=640,bg="white",highlightbackground="black",highlightthickness=1)
            self.controller = controller
            self.grid(row=0,column=0,sticky="nsew")
    class MainScreenFrameCenterSW(tk.Frame):
        def __init__(self, parent, controller,*args,**kwargs):
            tk.Frame.__init__(self,parent,height=350,width=640,bg="white",highlightbackground="black",highlightthickness=1)
            self.controller = controller
            self.grid(row=1,column=0,sticky="nsew")
    class MainScreenFrameCenterNE(tk.Frame):
        def __init__(self, parent, controller,*args,**kwargs):
            tk.Frame.__init__(self,parent,height=350,width=640,bg="white",highlightbackground="black",highlightthickness=1)
            self.controller = controller
            self.grid(row=0,column=1,sticky="nsew")
    class MainScreenFrameCenterSE(tk.Frame):
        def __init__(self, parent, controller,*args,**kwargs):
            tk.Frame.__init__(self,parent,height=350,width=640,bg="white",highlightbackground="black",highlightthickness=1)
            self.controller = controller
            self.grid(row=1,column=1,sticky="nsew") 
EN

回答 2

Stack Overflow用户

发布于 2020-10-13 03:25:50

您需要将所有类定义都放在同一级别的缩进中,从而将它们移动到全局作用域。

代码语言:javascript
复制
class MainScreenFrameCenter(tk.Frame):
    ...
class MainScreenFrameCenterNW(tk.Frame):
    ...
class MainScreenFrameCenterSW(tk.Frame):
    ...
class MainScreenFrameCenterNE(tk.Frame):
    ...
class MainScreenFrameCenterSE(tk.Frame):
    ...
票数 0
EN

Stack Overflow用户

发布于 2020-10-13 03:53:43

看起来你正在尝试制作一个小网格。类通常不嵌套在另一个类中。如果创建一个表示1个网格单元的类,则可以使用循环从它创建网格。

代码语言:javascript
复制
import tkinter as tk


class Cell(tk.Frame):
    def __init__(self, master, column:int=0, row:int=0, **kwargs):
        kwargs = {**{'bg':'white', 'highlightbackground':'black','highlightthickness':1}, **kwargs}
        tk.Frame.__init__(self, master, **kwargs)
        self.grid(column=column, row=row, sticky='nswe')
        
        
class App(tk.Tk):
    def __init__(self, **kwargs):
        tk.Tk.__init__(self)
        self.configure(**kwargs)
        
        cols = 2
        for i in range(cols):
            self.grid_columnconfigure(i, weight=1)
            
        rows = 2
        for i in range(rows):
            self.grid_rowconfigure(i, weight=1)
        
        for i, c in enumerate(['nw', 'ne', 'sw', 'se']):
            self.__dict__[f'widgets_{c}'] = Cell(self, i%cols, i//cols)
            
            
        self.widgets_nw['background'] = 'red'
                
        
if __name__ == '__main__':
    root = App(background="white", highlightbackground="black", highlightthickness=1)
    root.geometry('640x680+300+300')
    root.title('not Can is Should Example')
    root.mainloop()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64321871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档