Как установить местоположение всплывающего окна Tkinter Dialog? - PullRequest
0 голосов
/ 25 сентября 2019

У меня проблемы с открытием всплывающего диалогового окна, где бы я хотел.Я играл с 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()

Спасибо за помощь!

1 Ответ

0 голосов
/ 29 сентября 2019

Вопрос : установить местоположение Tkinter Dialog?

Вы используете simpledialog.Dialog, который блокирует in __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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...