繁体   English   中英

如何设置 Tkinter 对话框弹出的位置?

[英]How do I set the location of a Tkinter Dialog pop-up?

我无法在我想要的位置打开自定义对话框。 我玩过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:

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()

谢谢您的帮助!

问题:设置一个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM