Требуется ли БД для сохранения введенного пользователем значения из Tkinter GUI? - PullRequest
0 голосов
/ 08 июля 2020

Я работал с одним из инструментов SEO и пытался создать приложение GUI, в котором пользователь будет вводить ссылку на веб-сайт. Затем моя функция list_of_url () выполнится, чтобы найти все имеющиеся ссылки.

```python
def ui_for_website():
    app = Tk()
    app.title("Scrapper")
    app.geometry("300x300")
    
    ui_text=StringVar(app,name="str")
    ui_text_label=Label(app,text="Enter your website: ",font=('bold',12),pady=20)
    ui_text_label.grid(row=0,column=0)
    ui_text_entry=Entry(app,textvariable=ui_text)
    ui_text_entry.grid(row=0,column=1)
    #onclick=lambda : ui_text_entry.get()
    ui_text_button=Button(app,text="Submit",command=lambda : onClick(ui_text_entry,app))

    ui_text_button.grid(row=2,column=1)
    
    ui_text=ui_text_entry.get()
    print(ui_text)
    app.mainloop()
```

Вот мой код пользовательского интерфейса Tkinter, в который я прошу пользователя ввести.

```python
def onClick(entry,app):
    #global website_name
    website_name=entry.get()
    #print(website_name)
    #app.quit()
    return website_name
``

вот мой метод onClick, который выполняется, когда пользователь нажимает кнопку «Отправить». Я пытаюсь вернуть значение и сохранить его в переменной website_name.

```python
def list_of_url():
    
    url=ui_for_website()
    print(url)
    urls=session.get(url).html.absolute_links
    
    tree = sitemap_tree_for_homepage(url)
    #print(len(tree.all_pages()))
    #print(len(tree.pages))
    url_list=[]
    for page in tree.all_pages():
        if ('admin' not in page.url) and (page.url not in url_list):
            url_list.append(page.url)

    print(len(url_list))
    return url_list
```

Это имя_сайта, я обращаюсь к нему с помощью этого метода list_of_urls (). Но однажды tkinter закрывается. Значение этой переменной становится нулевым, и я не могу получить значение.

Ошибка, которую я получил:

Traceback (most recent call last):
  File "Indexing.py", line 89, in <module>
    list_of_url()
  File "Indexing.py", line 42, in list_of_url
    urls=session.get(url).html.absolute_links
  File "C:\Users\<username>\Anaconda3\lib\site-packages\requests\sessions.py", line 546, in get
    return self.request('GET', url, **kwargs)
  File "C:\Users\<username>\Anaconda3\lib\site-packages\requests\sessions.py", line 519, in request
    prep = self.prepare_request(req)
  File "C:\Users\<username>\Anaconda3\lib\site-packages\requests\sessions.py", line 462, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "C:\Users\<username>\Anaconda3\lib\site-packages\requests\models.py", line 313, in prepare
    self.prepare_url(url, params)
  File "C:\Users\<username>\Anaconda3\lib\site-packages\requests\models.py", line 387, in prepare_url
    raise MissingSchema(error)
requests.exceptions.MissingSchema: Invalid URL 'None': No schema supplied. Perhaps you meant http://None?

Итак, это заставляет меня думать, требуется ли БД для сохранения пользовательского ввода стоимость. Так что даже если GUI будет уничтожен или закрыт. Я сохраню введенное пользователем значение.

Вот мой полный код:

```python
from requests_html import HTMLSession
from tkinter import *

from usp.tree import sitemap_tree_for_homepage

session=HTMLSession()
#website_name=''

def onClick(entry,app):
    #global website_name
    website_name=entry.get()
    print(website_name)
    #app.quit()
    return website_name

def ui_for_website():
    app = Tk()
    app.title("Scrapper")
    app.geometry("300x300")
    
    ui_text=StringVar(app,name="str")
    ui_text_label=Label(app,text="Enter your website: ",font=('bold',12),pady=20)
    ui_text_label.grid(row=0,column=0)
    ui_text_entry=Entry(app,textvariable=ui_text)
    ui_text_entry.grid(row=0,column=1)
    #onclick=lambda : ui_text_entry.get()
    ui_text_button=Button(app,text="Submit",command=lambda : onClick(ui_text_entry,app))

    ui_text_button.grid(row=2,column=1)
    
    ui_text=ui_text_entry.get()
    print(ui_text)
    app.mainloop()

def list_of_url():
    
    url=ui_for_website()
    print(url)
    urls=session.get(url).html.absolute_links
    
    tree = sitemap_tree_for_homepage(url)
    #print(len(tree.all_pages()))
    #print(len(tree.pages))
    url_list=[]
    for page in tree.all_pages():
        if ('admin' not in page.url) and (page.url not in url_list):
            url_list.append(page.url)

    print(len(url_list))
    return url_list
```

1 Ответ

1 голос
/ 08 июля 2020

Tkinter не требует подключения к базе данных. Сообщения об ошибках относятся к request к http. Чтобы быть более конкретным c, он исходит из библиотеки requests html. База данных не задействована.

...