Saat ini saya sedang mengimplementasikan program yang menggunakan banyak bingkai tkinter dan ketika subframe dibuka, saya ingin superframe dikunci untuk pengguna (jika tidak, semuanya tidak akan berhasil). Setelah beberapa penelitian saya menemukan metode grab_set dan grab_release yang bekerja dengan baik.

Namun begitu subframe (dicontohkan oleh Toplevel) memanggil askstring, ambil "hilang" dan pengguna dapat berinteraksi dengan jendela superlevel lagi. Contohnya adalah ini (kode yang sangat disederhanakan):

import tkinter as tk
import tkinter.simpledialog

root = tk.Tk()
def open_sublevel():
    tl = tk.Toplevel(root)
    def ask():
        print(tk.simpledialog.askstring("askstring", "askstring"))
    tk.Button(tl, text="ask", command=ask).pack()
    tl.grab_set()
    root.wait_window(tl)
    tl.grab_release()
    print("release")


tk.Button(root, text="asdf", command=open_sublevel).pack()
tk.mainloop()

Setelah pengguna membuka subframe dengan mengklik "asdf", frame yang berisi "asdf" akan dikunci selama subframe dibuka. Namun begitu pengguna memilih "tanya" -Tombol di subframe, "kunci" ini entah bagaimana menghilang.

0
PfannkuchenXD 10 Agustus 2017, 22:41

2 jawaban

Jawaban Terbaik

Menurut catatan di perpustakaan tkinter:

Ambil mengarahkan semua acara ke widget ini dan turunannya di aplikasi.

Sejauh ini saya tidak dapat menemukan dokumentasi apa pun yang akan menjelaskan mengapa grab_set() jatuh setelah Anda selesai mengirimkan askstring Anda, tetapi saya akan membayangkannya karena setelah widget hilang, grab_set() jatuh. Sama seperti jika Anda menutup jendela Toplevel.

Dalam hal ini tl.grab_release() tampaknya tidak diperlukan karena ambil rilis setelah jendela ditutup.

Dari apa yang saya uji jika Anda mengatur ulang grab_set() setelah askstring selesai maka itu akan tetap berfungsi dengan baik.

Anda hanya perlu menambahkan tl.grab_set() tepat di bawah print(tk.simpledialog.askstring("askstring", "askstring")).

Kode yang dimodifikasi di bawah ini:

import tkinter as tk
import tkinter.simpledialog

root = tk.Tk()

def open_sublevel():
    tl = tk.Toplevel(root)
    tl.grab_set()

    def ask():
        print(tk.simpledialog.askstring("askstring", "askstring"))
        tl.grab_set()

    tk.Button(tl, text="ask", command=ask).pack()
    print("release")

tk.Button(root, text="asdf", command=open_sublevel).pack()
tk.mainloop()
1
Mike - SMT 10 Agustus 2017, 21:53

Menyetel induk untuk simpledialog akan membuat simpledialog menjadi fokus

X = simpledialog(parent = window_x, title = z dll.)

Ini akan memastikan x mengambil fokus dan tidak mundur

0
Alice 8 April 2018, 18:12