Python TksimpleDialog позиционирование рядом с корневым окном

#python #python-2.7 #tkinter

#python #python-2.7 #tkinter

Вопрос:

Я пытаюсь открыть простое диалоговое окно, в котором пользователь вводит выбор на основе меню, представленного в корневом окне. Однако, когда я запускаю код, диалоговое окно открывается непосредственно над меню в корневом окне, скрывая его из виду. Есть ли способ открыть диалоговое окно, чтобы оно открывалось рядом с корневым окном, как показано на прилагаемом изображении.

введите описание изображения здесь

Я проверил эту ссылку, и, похоже, нет никаких аргументов позиционирования для простых диалоговых окон. Я также пробовал с toplevel, но это запуталось при открытии нескольких окон.

Мой код выглядит следующим образом:

 from Tkinter import *
import tkSimpleDialog

root = Tk()
root.lift()


Label(root, text = "Menu Choices:").grid(row=1, column =0)
Label(root, text='1. Baloney and cheese').grid(row=2, column=0, pady=4)
Label(root, text='2. Roast chicken and gravy').grid(row=3, column=0, pady=4)
Label(root, text='3. Pear salad').grid(row=4, column=0, pady=4)
Label(root, text='4. Cateloupe and brocoli soup').grid(row=5, column=0, pady=4)

people = ["Liam","Henry","Paula"]

menuChoice = []

for i in people:
    c = tkSimpleDialog.askinteger('Franks Restaurant', 'Please choose your meal?', parent = root)
    menuChoice.append(c)

root.mainloop()
  

Комментарии:

1. это очень странный способ получения входных данных от пользователя, а не то, как графические интерфейсы предназначены для работы. Почему вы не делаете кнопки выбора меню или радиокнопки и вообще избегаете диалога?

2. Вы должны просто добавить запись или список в главное окно.

3. @BryanOakley Dashadower Спасибо за ваши комментарии, но это всего лишь пример проблемы, когда я хотел генерировать всплывающие окна и назначать. Как вы говорите, может быть, лучше всего отображать всю информацию на корневом экране, но поскольку я перебирал список вариантов, а затем обновлял словарную статью с выбором, я решил сделать это таким образом. Возможно, просто невозможно привязать простое диалоговое окно к стороне корневого окна…..

4. @Брайан, является ли использование tkSimpleDialog хорошей практикой или нет, это другой вопрос. Вопрос здесь очень прост, и его можно свести к следующему: «Как я могу расположить tkSimpleDialog там , где я хочу?» Это правильный и очень хороший вопрос. У меня такая же проблема.

5. @alkey, твой вопрос — вопрос на миллион долларов! 🙂 Это то, к чему я пришел после долгого исследования, в ходе которого я обнаружил тот же самый точный вопрос, оставшийся без ответа, еще в 3 местах. Что действительно раздражает, так это то, что диалоговое окно размещается случайным образом, обычно в верхнем левом углу экрана. Они могли бы, по крайней мере, разместить в центре!

Ответ №1:

Один из способов — использовать виджет верхнего уровня. И это совсем не грязно. В любом случае, чтобы разместить ваш входной фрейм там, где вы хотите, вам сначала нужно установить размеры и положение вашего основного (корневого) фрейма:

 from Tkinter import *
import ttk

root = Tk()
root.lift()
w = 300; h = 200; x = 10; y = 10
root.geometry('%dx%d %d %d' % (w, h, x, y))

Label(root, text = "Menu Choices:").grid(row=1, column =0)
Label(root, text='1. Baloney and cheese').grid(row=2, column=0, pady=4)
Label(root, text='2. Roast chicken and gravy').grid(row=3, column=0, pady=4)
Label(root, text='3. Pear salad').grid(row=4, column=0, pady=4)
Label(root, text='4. Cateloupe and brocoli soup').grid(row=5, column=0, pady=4)

def store_entry():
  print "Entry stored as " ent.get()

def exit_entry():
  print "Entry cancelled"
  top.destroy()

top = Toplevel()
top.title('Franks Restaurant')
top.geometry("%dx%d %d %d" % (w, h, w x 20, y))
Label(top, text='Please choose your meal').place(x=10,y=10)
ent = Entry(top); ent.place(x=10, y=50); ent.focus()
Button(top, text="OK", command=store_entry).place(x=10, y=150) 
Button(top, text="Cancel", command=exit_entry).place(x=60, y=150)  

root.mainloop()
  

Это пример расположения окна пользовательского ввода там, где вы хотите. Вам необходимо реализовать его для проверки и хранения пользовательского ввода и для стольких пользователей, сколько вам нужно.

Ответ №2:

библиотека Tk на самом деле имеет функцию, которая делает это, хотя она номинально «частная». Вы можете использовать его следующим образом.

 import tkinter as tk

root = tk.Tk()
root.wm_geometry("800x600")
dialog = tk.Toplevel(root)
root_name = root.winfo_pathname(root.winfo_id())
dialog_name = dialog.winfo_pathname(dialog.winfo_id())
root.tk.eval('tk::PlaceWindow {0} widget {1}'.format(dialog_name, root_name))
root.mainloop()
  

Это поместит ваш диалог по центру указанного окна (в данном случае корневого окна).

Ответ №3:

  • Вот пример позиционирования диалогового окна относительно главного окна.
  • Каждый раз, когда вы открываете диалоговое окно, оно будет отслеживать положение корневого окна.
  • он использует геометрию для установки левой и верхней позиции диалогового окна

 import tkinter as tk

try:  # allows the text to be more crisp on a high dpi display
  from ctypes import windll
  windll.shcore.SetProcessDpiAwareness(1)
except:
  pass

# ----------------------------------------------------------------------------
class CustomDialog:
    def __init__(self, parent):
        self.top = tk.Toplevel(parent)

        xPos = root.winfo_x()
        yPos = root.winfo_y()
        posStr = " "   str(xPos   160)   " "   str(yPos)
        self.top.geometry(posStr)

        tk.Label(self.top, text="Dlg is positioned relative to root window.").pack()
        tk.Button(self.top, text="Ok", command=self.Ok).pack()

    def Ok(self):
        self.top.destroy()

# ----------------------------------------------------------------------------
def onOpenDlg():
    inputDialog = CustomDialog(root)
    root.wait_window(inputDialog.top)

# ----------------------------------------------------------------------------
root = tk.Tk()
tk.Label(root, text="Position Dlg Example").pack()
tk.Button(root, text="Open Dlg", command=onOpenDlg).pack()

root.mainloop()
  

Комментарии:

1. Было бы здорово, если бы вы могли сделать tkinter Tkinter , потому что OP использует python 2.x и другие необходимые изменения тоже

2. Классное облако хорошая точка зрения. я не заметил использования 2.x в OP.