如何使用Tkinter创建url变量

2024-03-29 02:40:07 发布

您现在位置:Python中文网/ 问答频道 /正文

myClick功能用于将文件从internet下载到运行应用程序的PC。 我希望能够随时更改用于下载文件的url,而无需在运行应用程序的每台pc上更新应用程序

def myClick():

filename = Path.home() / "Desktop" / "AccountintApp.xlsm"
url = 'https://xxxxxxxxx.mediafire.com/xxxxxxxx/xxxxxxxxxxx/AccountingApp.xlsm'
urllib.request.urlretrieve(url, myfile)
os.startfile(myfile)

我已经想到了下面的方法,但是我不知道如何用代码编写它们

def myClick
url_link = (a line that make access to an online google sheet for example where the download link is stored where I can change the url easily)

filename = Path.home() / "Desktop" / "AccountintApp.xlsm"
url = (url_link)
urllib.request.urlretrieve(url, myfile)
os.startfile(myfile)

有什么建议吗


1条回答
网友
1楼 · 发布于 2024-03-29 02:40:07

因此,我编写了一些代码,添加了一个菜单,可以在其中更改url,然后将其保存到一个文件中(代码更像是一个如何实现的想法):

from tkinter import Tk, Menu, Toplevel, Label, Entry, Button, Frame, StringVar, PhotoImage
import json


try:
    with open('settings.json') as file:
        settings_data = json.load(file)
except FileNotFoundError:
    with open('settings.json', 'w') as file:
        to_dump = {'url': None}
        json.dump(to_dump, file, indent=2)
    with open('settings.json') as file:
        settings_data = json.load(file)


class MainWindow(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.geometry('700x500')
        self.menu_bar = Menu(self)
        self.config(menu=self.menu_bar)

        self.menu = Menu(self.menu_bar, tearoff=0)
        self.menu_bar.add_cascade(label='File', menu=self.menu)

        self.menu.add_command(label='Settings', command=self.show_options)

    def show_options(self):
        settings = Settings(self)
        settings.focus_force()


class Settings(Toplevel):
    def __init__(self, parent):
        Toplevel.__init__(self, parent)
        self.parent = parent
        self.overrideredirect(True)
        self.geometry(f'700x500+{self.parent.winfo_rootx()}+{self.parent.winfo_rooty()}')
        self.bind('<FocusOut>', self.close)
        self.config(bg='grey20')

        self.settings = settings_data

        # url settings                            -
        self.url_frame = Frame(self, bg='grey20', relief='sunken', bd=3)
        self.url_frame.pack(side='top', fill='x', padx=10, pady=10)

        Label(self.url_frame, text='Uniform Resource Locator', bg='grey20',
              fg='white', font='default 10 normal').pack(side='top')

        self.url_var = StringVar(value=self.settings['url'])
        self.current_url = Label(self.url_frame, textvariable=self.url_var, wraplength=600,
                                 anchor='w', bg='grey20', fg='white', font='default 12 normal')
        self.current_url.pack(side='left', padx=5, pady=5, expand=True, fill='x')

        self.url_edit_btn = Button(self.url_frame, text='Edit', width=5,
                                   command=self.edit_url, bg='grey20', fg='white',
                                   activebackground='grey30', activeforeground='white')
        self.url_edit_btn.pack(side='right', padx=5, pady=5)

        self.edit_url_entry = Entry(self.url_frame, justify='left', bg='grey20', fg='white',
                                    font='default 12 normal', selectbackground='white',
                                    selectforeground='grey20')
        self.url_save_changes_btn = Button(self.url_frame, text='Save', width=5,
                                           command=lambda: self.url_changes('save'), bg='grey20', fg='white',
                                           activebackground='grey30', activeforeground='white')
        self.url_cancel_changes_btn = Button(self.url_frame, text='Cancel', width=5,
                                             command=lambda: self.url_changes('discard'), bg='grey20', fg='white',
                                             activebackground='grey30', activeforeground='white')
        #                                    

    def save_settings(self):
        with open('settings.json', 'w') as file_:
            json.dump(self.settings, file_, indent=2)

    def close(self, event):
        if event.widget == self:
            self.destroy()

    def edit_url(self):
        self.current_url.pack_forget()
        self.url_edit_btn.pack_forget()

        self.edit_url_entry.pack(side='left', padx=5, pady=5, expand=True, fill='x')
        self.url_cancel_changes_btn.pack(side='right', padx=5, pady=5)
        self.url_save_changes_btn.pack(side='right', padx=5, pady=5)

        self.edit_url_entry.insert(0, self.url_var.get())
        self.edit_url_entry.selection_range(0, 'end')
        self.edit_url_entry.focus_set()

    def url_changes(self, to_do):
        if to_do == 'save':
            url = self.edit_url_entry.get()
            self.settings['url'] = url
            self.url_var.set(url)
            self.save_settings()
        self.edit_url_entry.pack_forget()
        self.url_cancel_changes_btn.pack_forget()
        self.url_save_changes_btn.pack_forget()

        self.current_url.pack(side='left', padx=5, pady=5, expand=True, fill='x')
        self.url_edit_btn.pack(side='right', padx=5, pady=5)


root = MainWindow()
pixel = PhotoImage(width=1, height=1)
root.mainloop()

我会很快带你走过:

首先导入所有必要的东西

如果设置文件不存在或找不到,请尝试打开该文件创建一个新的设置文件向其添加一个字典(如果当前需要,可以添加更多设置,只需url)并打开新创建的设置文件

创建一个主窗口,它基本上只有菜单,也就是它(简单的菜单)和一个调用设置窗口的函数

定义Settings

首先,它从Toplevel继承,以便更容易创建窗口

设置所有基本内容并绑定到'<FocusOut>',这样它会破坏窗口,因此只能创建一个窗口(因为它会在调用另一个窗口之前破坏)

为了简单起见,只需将设置数据设置为self属性

设置设置窗口,只是一些样式(对功能不重要)

前几个小部件用于当前显示,编辑按钮使url可编辑。它将一个条目放在url的位置,并允许输入一个新的条目,单击save将把url保存到文件中,单击cancel将不做任何事情,只返回到以前的状态

该文件将在当前目录中创建,您可以随时更改url,而无需硬编码

如果你有问题,问他们

相关问题 更多 >