Python Tkinter:如何为弹出窗口添加自定义边框

0 投票
1 回答
2331 浏览
提问于 2025-04-28 16:46

下面是我的代码示例。我不明白为什么我无法在弹出窗口周围创建一个细细的黑色边框。

请注意,我故意使用 self.top.overrideredirect(True) 去掉了默认的边框。不过,我想重新创建一个细边框。

请尝试以下代码(Python 2.7):

from Tkinter import Tk, Frame, Toplevel, Label

class srcDestDescription(Frame):
   def __init__(self, parent):
      Frame.__init__(self, parent)
      self.top = Toplevel(parent)
      self.parent = parent
      self.top.overrideredirect(True)
      self.top.geometry('+%d+%d' % (350, 100))
      self.top.withdraw()
   def display(self):
      self.top.deiconify()
      topLabel = Label(self.top, text = "Hello World")
      topLabel.grid(column = 0, columnspan = 2, row = 0, sticky = 'NSWE', padx = 10, pady = (10, 5))
      topLabel.config(font = ('times', 14))

class Application(Frame):

   def __init__(self, parent):
      Frame.__init__(self, parent)
      self.parent = parent
      self.parent.geometry('%dx%d+%d+%d' % (300, 300, 0, 0))
      self.parent.resizable(0, 0)

      self.pack(expand = True)
      self.srcDestDescription = srcDestDescription(self)
      self.srcDestDescription.display()

def main():
   root = Tk()
   Application(root)
   root.mainloop()

if __name__ == '__main__':
   main()
暂无标签

1 个回答

0

以下内容对我来说是有效的

from Tkinter import Tk, Frame, Toplevel, Label

class MyTop(Toplevel):
   def __init__(self, parent):
      Toplevel.__init__(self, parent)
      self.overrideredirect(True)
      self.withdraw()
      self.geometry('+%d+%d' % (350, 100))
      topLabel = Label(self, text="Hello World",
                       borderwidth=1, relief='solid')
      topLabel.pack(padx=10, pady=(10, 5))
      topLabel.config(font = ('times', 14))

class Application(Frame):

   def __init__(self, parent):
      Frame.__init__(self, parent)
      self.parent = parent
      self.parent.geometry('%dx%d+%d+%d' % (300, 300, 0, 0))
      self.parent.resizable(0, 0)

      self.pack(expand = True)
      self.mytop = MyTop(self.parent)
      self.mytop.deiconify()

def main():
   root = Tk()
   Application(root)
   root.mainloop()

if __name__ == '__main__':
   main()

关于工具提示弹出窗口的代码,可以在 Pythonxy/lib/idlelib/ToolTip.py 找到。这个代码是基于 Toplevel 的,但它并不是 Toplevel 的子类。(如果你想用这个,可以复制一下。)Idle 的 CalltipWindow 弹出窗口也类似,不过稍微复杂一点。

另一种实现细边框弹出窗口的方法是使用一个菜单实例,并调用 tk_popup(self, x, y, entry='')(文档说明是“在位置 X,Y 显示菜单,带有条目 ENTRY。”)。通常这个用法是用在右键菜单上,但你也可以自己想出其他用法。Idle 的例子在 Pythonxy/Lib/idlelib/EditorWindow.py 中,具体是 EditorWindow.right_menu_event。

撰写回答