ustone 发表于 2025-2-25 11:04:35

这个Python的tkinter程序有点不理解

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+300+300')
    root.mainloop()

if __name__=='__main__':
    main()

JuncoJet 发表于 2025-2-25 11:39:04

MenuApp2继承自Frame
ex是MenuApp2的实例化

ustone 发表于 2025-2-25 11:54:58

JuncoJet 发表于 2025-2-25 11:39
MenuApp2继承自Frame
ex是MenuApp2的实例化

那Frame跟root窗口什么关系呢?代码中没有体现

JuncoJet 发表于 2025-2-25 12:59:40

ustone 发表于 2025-2-25 11:54
那Frame跟root窗口什么关系呢?代码中没有体现

他们的关系可能类似glut
glut负责窗口,但渲染代码是opengl;P

ustone 发表于 2025-2-25 13:36:57

JuncoJet 发表于 2025-2-25 12:59
他们的关系可能类似glut
glut负责窗口,但渲染代码是opengl

搞不懂了

JuncoJet 发表于 2025-2-25 13:49:12


qt也这样的

ustone 发表于 2025-2-25 14:01:48

JuncoJet 发表于 2025-2-25 13:49
qt也这样的

你用gvim这个编辑器,没办法使用Qt的窗口设计器吧?

JuncoJet 发表于 2025-2-25 14:07:29

ustone 发表于 2025-2-25 14:01
你用gvim这个编辑器,没办法使用Qt的窗口设计器吧?

Qt环境没装,之前用 QtCreater 写的代码

ustone 发表于 2025-2-25 16:33:00

JuncoJet 发表于 2025-2-25 14:07
Qt环境没装,之前用 QtCreater 写的代码

Qt还是不错的

scoopydoo 发表于 2025-2-25 18:02:54

应该是第 8 行的 self.pack(...) 把自己放到了 root 上。

ustone 发表于 2025-2-25 18:41:58

scoopydoo 发表于 2025-2-25 18:02
应该是第 8 行的 self.pack(...) 把自己放到了 root 上。

没错      

ustone 发表于 2025-2-25 18:46:24

其它网友的答案(来自AI):

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

2. **super().__init__() 的行为**:调用 `super().__init__()` 时,Frame 会自动查找已经存在的根窗口,并将其作为父窗口。
页: [1]
查看完整版本: 这个Python的tkinter程序有点不理解