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?
2 jawaban
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()
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()