Pertama-tama, saya tahu ini bukan pertanyaan, tetapi sangat membutuhkan bantuan.

Saya memiliki program yang berfungsi dengan baik di CLI, tetapi sekarang saya mulai membuat kode GUI dengan tkinter. Saya membuat metode yang membuat jendela dan menerima tanggal untuk sisa program. Kode saya adalah sebagai berikut.

def getDate():

    global dayVar
    global dayMenu
    global yearVar
    global yearMenu
    global monthVar
    global monthMenu

    rt = Tk()
    print(rt.state())
    print(rt)
    rt.resizable(width=False, height=False)
    rt.minsize(height=200, width=400)
    rt.title("Selecionar Data...")

    rt.update()

    rt.attributes("-topmost", True)
    rt.attributes("-topmost", False)

    Grid.rowconfigure(rt, 0, weight=1)
    Grid.columnconfigure(rt, 0, weight=1)

    frameTop = Frame(rt)
    frameTop.grid(row=0,column=0)

    dayVar = IntVar(rt)
    monthVar = StringVar(rt)
    yearVar = IntVar(rt)

    dayVar.set(1)
    monthVar.set("Janeiro")
    yearVar.set(2015)

    dayMenu = OptionMenu(frameTop, dayVar, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,31)

    monthMenu = OptionMenu(frameTop, monthVar, "Janeiro", "Fevereiro", "Marco", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro","Dezembro")

    yearMenu = OptionMenu(frameTop, yearVar, "")
    for i in range(2015, datetime.datetime.today().year + 1):
        # Add a new item (i - in this case an int) to the option menu
        yearMenu['menu'].add_command(label=i, command=_setit(yearVar, i))
        yearVar.set(2015)


    #PACKING/GRIDING
    Label(frameTop, text="Dia").grid(row=0,column=0,sticky=NSEW)
    Label(frameTop, text="Mes").grid(row=1,column=0,sticky=NSEW)
    Label(frameTop, text="Ano").grid(row=2,column=0,sticky=NSEW)
    dayMenu.grid(row=0,column=1,sticky=NSEW)
    monthMenu.grid(row=1,column=1,sticky=NSEW)
    yearMenu.grid(row=2,column=1,sticky=NSEW)


    frameBottom = Frame(rt)
    frameBottom.grid(row=1,column=0)

    b = Button(rt, text="Próximo", command=rt.destroy)
    b.grid(row=1)

    rt.mainloop(1)

Masalahnya adalah jika saya menjalankan metode ini tanpa sisa program, itu akan memuat dan menampilkan jendela dengan sempurna. Ketika saya menjalankan seluruh kode, itu tidak berjalan dengan cara apa pun. Anehnya itu tidak menunjukkan kesalahan, itu tidak mogok, dan jika saya memasukkan banyak cetakan di tengah-tengah kode yang membuat dan menyisipkan sesuatu di jendela (rt adalah var saya untuk jendela =>"rt=Tk()") semua dari mereka dicetak, karena mengabaikan semua perintah saya di tkinter.

Jika ada ide tentang apa yang bisa terjadi, saya akan senang mendengarnya. Saya pikir fakta bahwa saya menghancurkan jendela sebelumnya dan menggunakan var yang sama untuk membuat yang baru ini adalah masalahnya, jadi saya mengubah nama var. Tidak bekerja

Jika seseorang perlu melihat seluruh kode, tanyakan saja. Saya tidak akan mempostingnya terlebih dahulu karena terlalu besar, dan saya sangat berharap masalahnya ada di sini. Terima kasih sebelumnya

0
Breno Baiardi 10 Agustus 2017, 21:05

2 jawaban

Jawaban Terbaik

Saya telah menemukan solusinya, terima kasih untuk jasonharper untuk menjelaskan mengapa tidak menggunakan metode Tk() berulang kali.

Saya menggunakan Tk.destroy() dan instance sedang dihancurkan, dan begitu banyak referensi yang didapat. Itulah mengapa kode mengabaikan upaya baru saya dalam membuat jendela. Saya menemukan bahwa ketika saya menggunakan Tk.quit() jendela tertutup dan ketika saya menggunakan Tk() lagi itu membuat yang baru.

Mungkin itu bukan cara yang BENAR, tapi untuk saat ini saya akan membiarkannya seperti ini. Akan ada cara yang lebih baik untuk menghapus dan membuat jendela, dan saya akan mempelajari kemungkinan menerapkan penarikan dan penggunaan tab atau bingkai untuk menampilkan dan menyembunyikan barang.

0
Breno Baiardi 14 Agustus 2017, 16:20

Mungkin ada masalah lain, tapi yang pasti ini:

yearMenu['menu'].add_command(label=i, command=_setit(yearVar, i))

Di atas persis sama dengan ini:

result = _setit(yearVar, i)
yearMenu['menu'].add_command(label=i, command=result)

Dengan kata lain, Anda segera memanggil _setit saat membuat jendela. Jika fungsi itu memiliki efek samping menghancurkan jendela, Anda akan mendapatkan perilaku yang Anda gambarkan.

Atribut command memerlukan callable -- referensi ke suatu fungsi. Jika Anda perlu meneruskan parameter ke fungsi, biasanya membuat penutupan dengan lambda:

...add_command(...command=lambda i=i: _setit(yearVar, i))
1
Bryan Oakley 10 Agustus 2017, 18:50