鱼C论坛

 找回密码
 立即注册
查看: 181|回复: 3

[已解决]这个Python的tkinter程序有点不理解

[复制链接]
发表于 2025-2-25 13:41:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
p350.py
self.master指什么?
main函数里的ex跟root窗口怎么关联在一起的?
from tkinter import *
from tkinter import filedialog

class MenuApp2(Frame):
    def __init__(self):
        super().__init__()
        self.master.title('File dialog')
        self.pack(fill=BOTH,expand=True)

        menubar=Menu(self.master)
        self.master.config(menu=menubar)

        filemenu=Menu(menubar)
        filemenu.add_command(label='Open...',command=self.onOpen)
        menubar.add_cascade(label='File',menu=filemenu)

        self.txt=Text(self)
        self.txt.pack(fill=BOTH,expand=True)
 
    def onOpen(self):
        ftypes=[('Python files','*.py'),('All files','*')]
        dlg=filedialog.Open(self,filetypes=ftypes)
        f1=dlg.show()

        if f1!='':
            text=self.readFile(f1)
            self.txt.insert(END,text)

    def readFile(self,filename):
        with open(filename,'r',encoding='utf-8') as f:
            text=f.read()
        return text

def main():
    root=Tk()
    ex=MenuApp2()
    root.geometry('300x250+500+300')
    root.mainloop()

if __name__=='__main__':
    main()
最佳答案
2025-2-25 13:57:17
ooolinux 发表于 2025-02-25 13:51
FishC 发表于 2025-2-25 13:42
self.master 指什么? ...


是的,原代码之所以能够运行,是因为 Tkinter 的 Frame 类有一些默认行为。在没有显式地传递父窗口的情况下,Tkinter 会自动选择合适的父窗口。具体解释如下:

1. **自动设置 master**:在 `MenuApp2` 类中,我们没有显式地传递 `master` 参数,所以 Frame 默认会将其父窗口设置为根窗口 `Tk()`,这也是为什么原代码能够正常运行。

2. **super().__init__() 的行为**:调用 `super().__init__()` 时,Frame 会自动查找已经存在的根窗口,并将其作为父窗口。

为了更加明确并且更具可读性,我们可以显式地传递 `master` 参数,这样代码更易于理解和维护。

总体而言,原代码能正常运行是因为 Tkinter 针对这些情况做了默认处理。不过,为了写出更加清晰和可维护的代码,显式地传递父窗口(master)依然是推荐的做法。这有助于避免潜在的混淆和错误。

如果你还有其他疑问或者需要进一步的解释,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-2-25 13:42:05 | 显示全部楼层
self.master 指什么?

在 Tkinter 中,`self.master` 通常指的是父窗口或者根窗口。具体来说,当你继承 Frame 类时,`self.master` 指向包含该 Frame 的父窗口。在这个例子中,它指的是 root 窗口。

main 函数里的 ex 跟 root 窗口怎么关联在一起的?

当你创建 `MenuApp2()` 的实例时,`super().__init__()` 会调用 Frame 的构造函数,并且将 `root` 设置为它的父窗口(master)。因为 `main` 函数中的 `root` 是 `Tk()` 的实例,所以它实际上是整个应用的根窗口。

让我们修正这个程序中的一些小错误并给出最终代码:
from tkinter import *
from tkinter import filedialog

class MenuApp2(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.master.title('File dialog')
        self.pack(fill=BOTH, expand=True)

        menubar = Menu(self.master)
        self.master.config(menu=menubar)

        filemenu = Menu(menubar)
        filemenu.add_command(label='Open...', command=self.onOpen)
        menubar.add_cascade(label='File', menu=filemenu)

        self.txt = Text(self)
        self.txt.pack(fill=BOTH, expand=True)

    def onOpen(self):
        ftypes = [('Text files', '*.txt'), ('All files', '*')]
        dlg = filedialog.Open(self, filetypes=ftypes)
        f1 = dlg.show()

        if f1 != '':
            text = self.readFile(f1)
            self.txt.insert(END, text)

    def readFile(self, filename):
        with open(filename, 'r', encoding='utf-8') as f:
            text = f.read()
        return text

def main():
    root = Tk()
    ex = MenuApp2(master=root)
    root.geometry('300x250+500+300')
    root.mainloop()

if __name__ == '__main__':
    main()

希望这个解释对你有帮助!如果有其他问题,请继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-25 13:51:06 | 显示全部楼层
FishC 发表于 2025-2-25 13:42
self.master 指什么?

在 Tkinter 中,`self.master` 通常指的是父窗口或者根窗口。具体来说,当你继承  ...

解释得比较清楚,代码修改以后也容易理解了。不过,奇怪的是原代码也是可以正确运行的,是不是跟Frame的什么机制有关系?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-25 13:57:17 | 显示全部楼层    本楼为最佳答案   
ooolinux 发表于 2025-02-25 13:51
FishC 发表于 2025-2-25 13:42
self.master 指什么? ...


是的,原代码之所以能够运行,是因为 Tkinter 的 Frame 类有一些默认行为。在没有显式地传递父窗口的情况下,Tkinter 会自动选择合适的父窗口。具体解释如下:

1. **自动设置 master**:在 `MenuApp2` 类中,我们没有显式地传递 `master` 参数,所以 Frame 默认会将其父窗口设置为根窗口 `Tk()`,这也是为什么原代码能够正常运行。

2. **super().__init__() 的行为**:调用 `super().__init__()` 时,Frame 会自动查找已经存在的根窗口,并将其作为父窗口。

为了更加明确并且更具可读性,我们可以显式地传递 `master` 参数,这样代码更易于理解和维护。

总体而言,原代码能正常运行是因为 Tkinter 针对这些情况做了默认处理。不过,为了写出更加清晰和可维护的代码,显式地传递父窗口(master)依然是推荐的做法。这有助于避免潜在的混淆和错误。

如果你还有其他疑问或者需要进一步的解释,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-3 04:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表