Tkinter 对话框A位于主窗口中

Tkinter 对话框A位于主窗口中,tkinter,dialog,Tkinter,Dialog,先生,我学习tkinter有几个月了,我的问题是我不知道在哪里使用这个语句self.transient(master),因此当我的注册窗口出现对话框时 在我将在代码中使用瞬态语句的地方,对话框函数接受一个parent选项。从文件中: 使窗口成为文件对话框的逻辑父级。“文件”对话框已打开 显示在其父窗口的顶部。在Mac OS X上,这会使 将“文件”对话框转换为附着到父窗口的图纸 通常,在继承自Toplevel的类中,您将使用self。但是,您没有正确使用继承,因此如果不重写该类,继承将无法工作。

先生,我学习tkinter有几个月了,我的问题是我不知道在哪里使用这个语句self.transient(master),因此当我的注册窗口出现对话框时
在我将在代码中使用瞬态语句的地方,对话框函数接受一个
parent
选项。从文件中:

使窗口成为文件对话框的逻辑父级。“文件”对话框已打开 显示在其父窗口的顶部。在Mac OS X上,这会使 将“文件”对话框转换为附着到父窗口的图纸

通常,在继承自
Toplevel
的类中,您将使用
self
。但是,您没有正确使用继承,因此如果不重写该类,继承将无法工作。所以首先,我们需要重写这个类

首先要做的是调用超类的
\uuuu init\uuu
方法。这就是使您的
注册窗口成为实际的
顶级窗口的秘诀

from tkinter import *
import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename


class menu():
  def __init__(self, master):
    self.master = master  
    master.title('Library Management Software')
    master.geometry('1230x650')
    master.configure(background="#98ff98")
    master.iconbitmap("e:\library\image\save.ico")#adding icon on title window
    menubar = Menu(master)
    membermenu = Menu(menubar, tearoff=0)
    membermenu.add_command(label = "Member" , command = self.reg_window)
    menubar.add_cascade(label = "Entry", menu = membermenu)
    master.config(menu = menubar)
  def reg_window(self):
    self.newWindow = tk.Toplevel(self.master)
    self.app = registration_window(self.newWindow)

class registration_window(Toplevel):
  def __init__(self, master):
    
    self.master=master  
    #self.transient(master)
    master.title('Registration Form')
    master.geometry('1230x650')
    master.configure(background="#98ff98")
    master.iconbitmap("e:\library\image\save.ico")#adding icon on title window
    item_file = StringVar()
    image_label = Label(master, text="Photo: ", bg="gray74", relief="groove")
    image_label.place(x=755,y=150)
                 
    item_entry = Entry(master, textvariable=item_file,width=35)
    item_entry.place(x=795,y=150)
    self.item_button = Button(master, text="\uD83D\uDCC2", relief="groove",
                             command=lambda:entry_set(item_entry, askopenfilename()))
    self.item_button.place(x=1000, y=150, height=20, width=20)
    def entry_set(entry, text):
      item_entry.delete(0, 'end')
      item_entry.insert(END, text)

    




def main(): 
    root = tk.Tk()
    app = menu(root)
    root.mainloop()

if __name__ == '__main__':
    main()
接下来,您需要删除
self.master
master
的所有其他用法,而是使用
self
,以便所有小部件都在其内部。此外,在调用askopenfilename
时添加
parent=self
。该类应如下所示:

class registration_window(Toplevel):
  def __init__(self, master):
    super().__init__(master)
    ...
class registration_window(Toplevel):
  def __init__(self, master):

    super().__init__(master)
    self.title('Registration Form')
    self.geometry('1230x650')
    self.configure(background="#98ff98")
    self.iconbitmap("e:\library\image\save.ico")#adding icon on title window
    item_file = StringVar()
    image_label = Label(self, text="Photo: ", bg="gray74", relief="groove")
    image_label.place(x=755,y=150)

    item_entry = Entry(self, textvariable=item_file,width=35)
    item_entry.place(x=795,y=150)
    self.item_button = Button(self, text="yes, this button", relief="groove",
                             command=lambda:entry_set(item_entry, askopenfilename(parent=self)))
    self.item_button.place(x=1000, y=150, height=20, width=100)
    def entry_set(entry, text):
      item_entry.delete(0, 'end')
      item_entry.insert(END, text)
最后,要使用这个类,您不需要创建另一个
Toplevel
。将
reg\u窗口更改为如下所示:

class registration_window(Toplevel):
  def __init__(self, master):
    super().__init__(master)
    ...
class registration_window(Toplevel):
  def __init__(self, master):

    super().__init__(master)
    self.title('Registration Form')
    self.geometry('1230x650')
    self.configure(background="#98ff98")
    self.iconbitmap("e:\library\image\save.ico")#adding icon on title window
    item_file = StringVar()
    image_label = Label(self, text="Photo: ", bg="gray74", relief="groove")
    image_label.place(x=755,y=150)

    item_entry = Entry(self, textvariable=item_file,width=35)
    item_entry.place(x=795,y=150)
    self.item_button = Button(self, text="yes, this button", relief="groove",
                             command=lambda:entry_set(item_entry, askopenfilename(parent=self)))
    self.item_button.place(x=1000, y=150, height=20, width=100)
    def entry_set(entry, text):
      item_entry.delete(0, 'end')
      item_entry.insert(END, text)

实际上,我相信,
transient(…)
所做的是,它创建了一个窗口,但顾名思义,它是临时的。该窗口不会显示在TaskBar中,当您想从我的第二个窗口打开文件对话框时,您希望文件对话框实际执行什么操作。该对话框将显示在第一个窗口上。这是我的问题
文件对话框
的哪一部分,比如你想要它做什么,询问目录还是文件名?我想打开一个图像文件,我想在一个条目小部件中捕获路径