【问题标题】:How do I set the location of a Tkinter Dialog pop-up?如何设置 Tkinter 对话框弹出窗口的位置?
【发布时间】:2020-01-25 02:14:00
【问题描述】:

我无法在我想要的位置打开自定义对话框。我玩过self.geometry("+%d+%d" % (x1, x2)),但没有成功。理想情况下,我希望它在鼠标指针所在的位置打开。

对话框通过菜单命令调用:

menu = tk.Menu(self.treeDocs, tearoff=0)
menu.add_command(label="Check-In",
                 command=lambda tv=self.treeDocs: self.CheckIn(tv))


def CheckIn(self, tv):
    cd = CalendarDialog(self)
    docDate = cd.result
    if docDate is not None:
        docID = tv.set(self.ident, "ID")
        conn = pyodbc.connect(strConn)
        cursor = conn.cursor()
        strSQL = '''INSERT INTO tblDocDates (ID_DOC, ACCESSDATE)
                    VALUES (%s, #%s#)''' % (docID, docDate)
        cursor.execute(strSQL)
        cursor.commit()

这是课程:

class CalendarDialog(tk.simpledialog.Dialog):
    def __init__(self, master, title="Check-In"):
        tk.simpledialog.Dialog.__init__(self, master, title="Check-In")

    def body(self, master):
        self.calendar = tkcalendar.DateEntry(master)
        self.calendar.pack()

    def apply(self):
        self.result = self.calendar.get()

感谢您的帮助!

【问题讨论】:

  • Edit 你的问题并显示def CheckIn(self, tv): 的调用方式并解释什么tv?
  • @stovfl 已更新,包含完整的签入和呼叫(通过菜单命令)。 tv 是一个树视图小部件。谢谢!
  • Menu.command 你没有得到x/y 光标位置,我能想到的最接近的是Tkinter.Menu.yposition-method。更改为lambda....CheckIn(tv, (x, y))。在哪里x=menu.winfo_x, y=menu.yposition(<index of menu item>).

标签: python python-3.x tkinter


【解决方案1】:

问题:设置Tkinter Dialog的位置?

您正在使用simpledialog.Dialog,它在__init__阻塞,直到它被销毁。
要放置Dialog,使用self.geometry(...,您必须挂钩self.deiconify(...


import tkinter as tk
from tkinter import simpledialog


class CalendarDialog(simpledialog.Dialog):    
    def __init__(self, master, coord=(0, 0), title=None):
        self.coord = coord
        super().__init__(master, title=title)
        # super() is blocking

    def deiconify(self):
        x, y = self.coord
        self.geometry('{width}x{height}+{x}+{y}'\
            .format(width=200, height=100, x=x, y=y))
        super().deiconify()

用法

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.menubar = tk.Menu(self, tearoff=0)
        self.config(menu=self.menubar)
        self.menubar.add_command(label="Check-In",
                                 command=lambda x=50, y=self.menubar.yposition(1):
                                 self.CheckIn(x, y))

    def CheckIn(self, x, y):
        coord = self.winfo_rootx() + x, self.winfo_rooty() + y
        cd = CalendarDialog(self, title='Check_In', coord=coord)


if __name__ == "__main__":
    App().mainloop()

用 Python 测试:3.5 - 'TclVersion':8.6 'TkVersion':8.6

【讨论】:

    猜你喜欢
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2016-04-02
    相关资源
    最近更新 更多