Сделайте ввод совпадения и если-еще - PullRequest
0 голосов
/ 31 мая 2019

У меня есть мой сценарий здесь

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()

И все работает, кроме соответствующей части. Когда я ввожу «y» или «n», или даже что-нибудь еще в поле ввода и нажимаю «Go», ничего не происходит ... Почему ничего не происходит? И как я могу заставить это работать?

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Нужно сделать 1 изменение и пару, которые неплохо исправить.

1-я «необходимость» изменить:

При использовании textvaraible в виджете tkinter вы должны использовать один из ObjectVars (IE: StringVar, IntVar и т. Д.). Помните также, что вам нужно будет использовать .get() на db, так как метод get() - это способ получения значения из ObjectVar.

Чтобы выполнить это изменение это:

db = ''

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

К этому:

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':

Кроме того, вы можете переместить ваш db код tkinter за root, иначе StringVar выдаст эту ошибку AttributeError: 'NoneType' object has no attribute '_root', поскольку вы еще не запустили экземпляр tk для StringVar для фиксации.

При этом вы должны также изменить способ импорта tkinter и, возможно, очистить имена ваших виджетов и способ упаковки.

Лучше сделать import tkinter as tk сверх from tkinter import *, потому что это помогает предотвратить случайную перезапись формы импорта, других импортов или ваших собственных имен переменных / функций / классов. Для работы с этим новым методом импорта вам просто нужно использовать префикс tk. для каждого метода / виджета.

Если вы не собираетесь изменять виджет в будущем (т.е. постоянная метка, кнопка или т. Д.), Вам не нужно присваивать его переменной, и вы можете просто использовать свой менеджер геометрии (в данном случае * 1029) *) на виджет напрямую.

Наконец, ваше if/else утверждение не совсем верно. Он будет работать, но эта строка db.lower() == 'n' не делает то, что вы думаете, она делает. У оператора else нет условий для выполнения. Это просто последний параметр в операторе if/elif/else, который будет выполняться, если не выполнено ни одно из других условий. Тем не менее, если вы ничего не хотите сделать, если не выполняется ни одно из других условий, вы можете просто удалить часть else вашего логического утверждения.

Посмотрите на приведенный ниже код:

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 голосов
/ 31 мая 2019
checkentree = Entry(root, textvariable=db)

Параметр textvariable должен быть StringVar. Но db - это строка, а не StringVar.
Попробуйте вместо этого передать StringVar.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...