Saya memiliki skrip saya di sini

from tkinter import *
from tkinter import messagebox
import commands

db=''

def launch():
        # Database Check.
            if db.lower() == 'y':
                commands.db_download()
            else:
                db.lower() == 'n'



root = Tk()


checklabel = Label(root, text="Check for new databases? Y/N: ")
checkentree = Entry(root, textvariable=db)
checkbutton = Button(root, text="Go", command=launch)


checklabel.pack()
checkentree.pack()
checkbutton.pack()


root.mainloop()

Dan semuanya berfungsi kecuali bagian yang cocok. Ketika saya memasukkan "y" atau "n", atau bahkan apa pun di kotak Entry dan klik Go, tidak ada yang terjadi... Mengapa tidak terjadi apa-apa? Dan bagaimana saya bisa membuatnya bekerja?

0
Ace 31 Mei 2019, 18:12

2 jawaban

Jawaban Terbaik
checkentree = Entry(root, textvariable=db)

Parameter textvariable harus berupa StringVar. Tapi db adalah string, bukan StringVar.
Coba lewati StringVar sebagai gantinya.

from tkinter import *
from tkinter import messagebox
import commands

def launch():
        # Database Check.
            if db.get().lower() == 'y':
                commands.db_download()
            #don't actually need these following lines because they don't do anything
            #else:
            #    #db.get().lower() == 'n'


root = Tk()
db=StringVar()


checklabel = Label(root, text="Check for new databases? Y/N: ")
checkentree = Entry(root, textvariable=db)
checkbutton = Button(root, text="Go", command=launch)


checklabel.pack()
checkentree.pack()
checkbutton.pack()


root.mainloop()
2
Kevin 31 Mei 2019, 15:18

Ada 1 perubahan yang perlu Anda lakukan dan beberapa yang merupakan ide bagus untuk diperbaiki.

1 "kebutuhan" untuk berubah:

Saat menggunakan textvaraible di widget tkinter, Anda harus menggunakan salah satu ObjectVars (IE: StringVar, IntVar, dan seterusnya). Ingatlah juga bahwa Anda perlu menggunakan .get() pada db karena metode get() adalah cara Anda mengambil nilai dari ObjectVar.

Untuk mencapai ini, perubahan ini:

db = ''

def launch():
    if db.lower() == 'y':

Untuk ini:

db = tk.StringVar()
db.set('') # not actually required in this instance but still good to know how to set the value of a ObjectVar.

def launch():
    if db.get().lower() == 'y':

Serta pindahkan kode tkinter db Anda melewati root atau StringVar akan memunculkan kesalahan ini AttributeError: 'NoneType' object has no attribute '_root' karena Anda belum memulai instance tk agar StringVar dapat dikunci.

Yang mengatakan Anda juga harus mengubah cara Anda mengimpor tkinter dan mungkin membersihkan nama widget Anda dan cara Anda mengemasnya.

Lebih baik melakukan import tkinter as tk di atas from tkinter import * karena ini membantu mencegah secara tidak sengaja menimpa impor dari impor lain atau nama variabel/fungsi/kelas Anda sendiri. Untuk bekerja dengan metode impor baru ini, Anda hanya perlu menggunakan awalan tk. untuk setiap penggunaan metode/widget.

Jika Anda tidak akan memodifikasi widget di masa mendatang (IE: label permanen, tombol, atau sebagainya), Anda tidak perlu menetapkannya ke variabel dan cukup menggunakan manajer geometri Anda (dalam hal ini pack() ) pada widget secara langsung.

Terakhir, pernyataan if/else Anda tidak sepenuhnya benar. Ini akan berfungsi tetapi baris ini db.lower() == 'n' tidak melakukan apa yang Anda pikirkan. Pernyataan else tidak memiliki kondisi yang harus dipenuhi. Itu hanya opsi terakhir dalam pernyataan if/elif/else yang akan berjalan jika tidak ada kondisi lain yang terpenuhi. Yang mengatakan jika Anda tidak ingin melakukan apa pun jika tidak ada kondisi lain yang terpenuhi, Anda dapat dengan mudah menghapus bagian else dari pernyataan logika Anda.

Perhatikan kode di bawah ini:

import tkinter as tk


def launch():
if db.get().lower() == 'y':
    print('commands.db_download()')
else:
    print('not y')   


root = tk.Tk()
db = tk.StringVar()
db.set('')

tk.Label(root, text="Check for new databases? Y/N: ").pack()
tk.Entry(root, textvariable=db).pack()
tk.Button(root, text="Go", command=launch).pack()

root.mainloop()
2
Mike - SMT 31 Mei 2019, 15:40