Я сейчас играю с программированием некоторого GUI с использованием tkinter
и сейчас борюсь с правильной настройкой положения дочернего окна, созданного с помощью tk.Toplevel()
То, чего я хочу добиться, - это иметь свой Новое окно расположено в верхнем правом углу главного окна. Поэтому я рассчитал целевую позицию, используя winfo
окна root, но даже если значения кажутся правильными с первого места, у y-позиции всегда есть смещение после установки этих значений
A маленький пример:
import tkinter as tk
def create_window():
window = tk.Toplevel(root)
root.update()
x = root.winfo_x() + root.winfo_width()
y = root.winfo_y()
print ("winfo_x:\t\t" + str(root.winfo_x()))
print ("winfo_y:\t\t" + str(root.winfo_y()))
print ("winfo_w:\t\t" + str(root.winfo_width()))
print ("winfo_h:\t\t" + str(root.winfo_height()))
print ("target x:\t\t" + str(x))
print ("target y:\t\t" + str(y) + "\n")
window.geometry("+%d+%d" % (x,y))
window.update()
print ("actual x:\t\t" + str(window.winfo_x()))
print ("actual y:\t\t" + str(window.winfo_y()))
root = tk.Tk()
root.geometry("800x600")
button = tk.Button(root, text="create window", command=create_window)
button.pack(side="top", fill="both", expand=1)
root.mainloop()
Например, вывод:
winfo_x: 722
winfo_y: 215
winfo_w: 800
winfo_h: 600
target x: 1522
target y: 215
actual x: 1522
actual y: 245
Так что при установке позиции с помощью geometry()
кажется, что она автоматически смещает позицию y
на высоту строки заголовка .
Я что-то здесь упускаю или мне действительно нужно отменить это смещение вручную? Но, как я понимаю, winfo
должен возвращать положение границы окна, а не его видимой области
Редактировать
Эта проблема возникает только на моем виртуальном Ubuntu-18.04 машина - на хосте windows 7 (python 3.8.0
) она работает как задумано. Я пытался python3.8
и python3.6.9
оба с tkinter 8.6