Как проверить, равен ли только один оператор 0? - PullRequest
0 голосов
/ 30 сентября 2018

У меня возникли проблемы с поиском соответствующего оператора if, чтобы проверить, равна ли только одна запись 0 из 3. Вот код:

def thanx(self):
    if len(self.e.get()) == 0:
        messagebox.showerror("Error", "Please enter affordable infos")
        self.boo = False
    else:
        messagebox.showinfo("Submition done", "Thank you")
        self.boo = True

Это только проверка, равна ли моя переменная e 0, но на самом деле я получил еще 2 записи.Я знаю, что мог бы проверить каждый в отдельности, однако должен быть более простой способ сделать это.Я использую "tkinter", кстати, но это не должно быть слишком важным.

Я пробовал это с or, но это не работает, или я делаю это неправильно.(Также пытался решить эту проблему с помощью лямбды, но опять же только ошибки ...)

Может быть, кто-то может помочь мне там ...

Редактировать: я мог бы объяснить это немного смущает, яЯ добавлю оставшуюся часть кода, чтобы вы могли лучше это понять:

from tkinter import Tk, Label, Entry, Button, W
from tkinter import messagebox

class MyForm:
    def thanx(self):
        if len(self.e.get()) == 0:
            messagebox.showerror("Error", "Please enter affordable infos")
            self.boo = False
        else:
            messagebox.showinfo("Submition done", "Thank you")
            self.boo = True
    def callback(self):
       #print("Name: %s\nPassword: %s\nEmail: %s" % (self.e.get(), self.e2.get(),self.e3.get()))
       if self.boo:
            f = open("PrivatData.txt", "w+")
            f.write("Name: %s\nPassword: %s\nEmail: %s" % (self.e.get(), self.e2.get(),self.e3.get()))
    def __init__(self):
            self.root = Tk()
            self.root.title("Your privat details")
            Label(self.root, text="Your Name").grid(row = 0, padx = 12, pady=5)
            Label(self.root, text="Password").grid(row=1, padx=12, pady=5)
            Label(self.root, text="Email").grid(row=2, padx=12, pady=5)
            self.e = Entry(self.root)
            self.e2 = Entry(self.root)
            self.e3= Entry(self.root)
            self.e.grid(row=0,column=1,columnspan=2)
            self.e2.grid(row=1, column=1, columnspan=2)
            self.e3.grid(row=2, column=1, columnspan=2)
            self.e.focus_set()
            self.show= Button(self.root, text="Submit", command=lambda:[self.thanx(),self.callback()])
            self.quit = Button(self.root,text="Quit", command = self.root.quit)
            self.show.grid(row=3, column=1, pady=4)
            self.quit.grid(row=3, column=2, sticky = W, pady=4)
            self.root.geometry("230x140")
            self.root.configure(background= "#65499c")
            self.root.mainloop()
if __name__ == "__main__":
    app= MyForm()

Ответы [ 4 ]

0 голосов
/ 30 сентября 2018

Чтобы все три текстовых поля не были пустыми в одном операторе if, вы можете использовать следующее:

if "" in [self.e.get().strip(), self.e2.get().strip(), self.e3.get().strip()]:
    messagebox.showerror("Error", "Please enter affordable infos")
    self.boo = False
else:
    messagebox.showinfo("Submition done", "Thank you")
    self.boo = True

Это короткий и аккуратный способ написать, что вы пытаетесь сделать.Это работает, потому что entry виджеты вернут "", если они пусты, а self.e.get().strip() делает возвращаемый текст пустым (.strip() удаляет все пробелы в начале и конце строки), если это просто пробел (" ", \t, n и т. Д.).

Лучше проверять содержимое строки, а не ее длину, потому что поле, содержащее только пробел, будет не возвращает 0, как показано ниже.

>>> len(" ")
1
>>> len("")
0
>>> len("\t")
1
0 голосов
/ 30 сентября 2018

Я предполагаю, что в данный момент вы проверяете, равен ли какой-либо строковый элемент 0. Например,

e = 'abc'
len(e) == 3 # True
l = []
len(l) == 0 # True

Если вы хотите проверить, равна ли ваша строковая переменная 0, то просто:

if not self.e.get():
    messagebox.showerror("Error")
    self.boo = False
0 голосов
/ 30 сентября 2018

Вы можете попробовать это:

if len(self.e.get()) == 0 or len(self.e2.get()) == 0 or len(self.e3.get()) == 0:
    messagebox.showerror("Error", "Please enter affordable infos")
    self.boo = False
else:
    messagebox.showinfo("Submition done", "Thank you")
    self.boo = True

Поскольку у вас есть 3 переменные, невозможно проверить их все «в пакетном режиме», пока вы не создадите структуру данных, содержащую их, а затем не проверите некоторые условия для этих данных.состав.Однако это не дает никакого преимущества.Если вы добавите новую переменную, скажем, e4, вам все равно придется добавить ее вручную в структуру данных.

0 голосов
/ 30 сентября 2018

Использование any:

if any((len(self.e.get().strip())==0,len(self.e2.get().strip())==0,len(self.e2.get().strip())==0)):
    do stuff to say that user did not input all fields
else:
    do stuff to say that user inputted all fields

Полный код:

from tkinter import Tk, Label, Entry, Button, W
from tkinter import messagebox

class MyForm:
    def thanx(self):
        if any((len(self.e.get().strip())==0,len(self.e2.get().strip())==0,len(self.e2.get().strip())==0)):
            messagebox.showerror("Error", "Please enter affordable infos")
            self.boo = False
        else:
            messagebox.showinfo("Submition done", "Thank you")
            self.boo = True
    def callback(self):
       #print("Name: %s\nPassword: %s\nEmail: %s" % (self.e.get(), self.e2.get(),self.e3.get()))
       if self.boo:
            f = open("PrivatData.txt", "w+")
            f.write("Name: %s\nPassword: %s\nEmail: %s" % (self.e.get(), self.e2.get(),self.e3.get()))
    def __init__(self):
            self.root = Tk()
            self.root.title("Your privat details")
            Label(self.root, text="Your Name").grid(row = 0, padx = 12, pady=5)
            Label(self.root, text="Password").grid(row=1, padx=12, pady=5)
            Label(self.root, text="Email").grid(row=2, padx=12, pady=5)
            self.e = Entry(self.root)
            self.e2 = Entry(self.root)
            self.e3= Entry(self.root)
            self.e.grid(row=0,column=1,columnspan=2)
            self.e2.grid(row=1, column=1, columnspan=2)
            self.e3.grid(row=2, column=1, columnspan=2)
            self.e.focus_set()
            self.show= Button(self.root, text="Submit", command=lambda:[self.thanx(),self.callback()])
            self.quit = Button(self.root,text="Quit", command = self.root.quit)
            self.show.grid(row=3, column=1, pady=4)
            self.quit.grid(row=3, column=2, sticky = W, pady=4)
            self.root.geometry("230x140")
            self.root.configure(background= "#65499c")
            self.root.mainloop()
if __name__ == "__main__":
    app= MyForm()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...