【问题标题】:Tkinter: Use Frame from another classTkinter:使用另一个类的框架
【发布时间】:2021-10-31 17:30:24
【问题描述】:

我正在练习创建一个包含不同文件的小项目以获得干净的代码。我想将黄色框从 (fyellow.py) 显示到 (ma​​in.py) 并从 (funbut.py 输入标签) 使用Button 的功能。这是我的代码示例:(3 个 Python 文件 - ma​​in.pyfyellow.pyfunbut.py

  • ma​​in.py

    from tkinter import *
    from fyellow import *
    import funbut
    
    root = Tk()
    root.geometry("500x500")
    
    # Show Yellow Frame into Main from (fyellow.py)
    myframe = Frameyellow(root)
    
    # Button with command - But_fun1
    but1 = Button(root, text="Text",command=funbut.but_fun1)
    but1.pack()
    
    
    root.mainloop()
    
  • funbut.py

    from tkinter import *
    from fyellow import *
    
    # Function of Button (but1) PROBLEM HERE! (ERROR - 'framey' is not defined)
    def but_fun1():
        label1 = Label(framey,text="LabelText")
        label1.place(x=10,y=10)
    
  • fyellow.py

    from tkinter import *
    
    class Frameyellow:
        def __init__(self,rootyellow):
            self.rootyellow = rootyellow
            self.framey = Frame(rootyellow, width=200,height=200,bg="yellow")
            self.framey.pack()
    

可以解释如何使用文件 (fyellow.py) 中的 self.framey 来避免
错误'framey' is not defined?

【问题讨论】:

  • 好吧.... framey 没有定义,你看到有定义的地方吗?使用函数参数将 master 传递给该标签,myframe 也不是 Frame
  • 请您安排我的代码,我该怎么做?我非常感谢你的帮助。 @Matiiss
  • 请您向我推荐 python Tkinter 的任何在线链接或书籍? (从初学者到专业人士)我在看你管视频..@Matiiss
  • 好吧,如果需要,您可以搜索特定库的文档,否则,如果您是初学者,请继续观看 youtube,如果您想了解更多信息,我还建议您练习一下,看看其他人做了什么,如果你问的是什么,也许可以向他们学习

标签: python python-3.x tkinter


【解决方案1】:

所以main.py 文件看起来像这样:

from tkinter import Tk, Button
from fyellow import FrameYellow
from funbut import place_label

root = Tk()
root.geometry("500x500")

my_frame = FrameYellow(root)
my_frame.pack()

but1 = Button(root, text="Text", command=lambda: place_label(my_frame))
but1.pack()

root.mainloop()

fyellow.py 像这样(虽然创建一个唯一目的是让框架具有不同颜色的类是没有意义的,只需使用参数并创建一个正常的框架):

from tkinter import Frame


class FrameYellow(Frame):
    def __init__(self, master, **kwargs):
        super().__init__(master, **kwargs, bg='yellow')

funbut.py应该是这样的:

from tkinter import Label


def place_label(parent, text='Text', pos=(0, 0)):
    Label(parent, text=text).place(x=pos[0], y=pos[1])

还有:
我强烈建议在导入某些内容时不要使用通配符 (*),您应该导入您需要的内容,例如from module import Class1, func_1, var_2 等等或导入整个模块:import module 然后你也可以使用别名:import module as md 或类似的东西,关键是不要导入所有东西,除非你真的知道你在做什么;名称冲突是问题所在。

【讨论】:

猜你喜欢
  • 2018-07-21
  • 2018-10-31
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
相关资源
最近更新 更多