pythonttkinter:将带有变量的函数传递到调用该函数的按钮中,并将var传递到输入表单中

2024-03-28 22:31:15 发布

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

这是我第一次在这里问问题,所以请原谅我。我正在尝试制作一个GUI,它可以将任何新的/更新的文本文件从一个文件传输到另一个文件。GUI还应该显示最后一次文件传输的日期作为参考。我的问题是自动抓取我的文件,而不是我的主要功能。我能做些什么来修复它只在按下相应按钮时运行的位置。在

import sqlite3
from tkinter import *
from tkinter import filedialog
import tkinter as tk
import datetime
from datetime import datetime, timedelta
import os
import shutil

databaseName = 'last_check.sqlite'
#make table
def datetime_tbl():
    conn = sqlite3.connect(databaseName)
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS datetime_tbl(datestamp TEXT)');
    c.close()
    conn.close()
#grab entry from ui
def data_entry():
    conn = sqlite3.connect(databaseName)
    c = conn.cursor()
    c.execute("INSERT INTO datetime_tbl (datestamp) VALUES (?)", 
(str(datetime.now()),))
    conn.commit()
    conn.close()

#this grabs file transfer from tbl for entry form              
def generatelasttransfer():
    conn = sqlite3.connect(databaseName)
    c = conn.cursor()
    global transfer
    transfer = c.execute("""SELECT MAX(datestamp) FROM datetime_tbl ORDER BY 
        datestamp DESC LIMIT 1""").fetchall() 
    #print(transfer)#testing
    return(transfer)
    c.close()
    #conn.close()    

def ui(root):
    transfer = StringVar()
    transfer.set(generatelasttransfer())
    src_filename = StringVar()
    src_filename.set(src_files())
    des_filename = StringVar()
    des_filename.set(des_files())

    #btn for main file transfer 
    btn_ck = tk.Button(text='File Transfer',command= f_transfer).grid(row = 
        7, column = 2, padx = 5, pady = 5)
    #btns for src and des files
    btn_src = tk.Button(text='Choose file to send out',command= 
        src_files).grid(row = 2, column = 2, padx = 5, pady = 5)
    btn_des = tk.Button(text='Choose file to send to',command= 
        des_files).grid(row = 2, column = 4, padx = 5, pady = 5)

    tk.Entry(text= src_filename).grid(row = 3, column = 2, padx = 15, pady = 5)
    tk.Entry(text= des_filename).grid(row = 3, column = 4, padx = 15, pady = 5)
    tk.Entry(root, textvariable = transfer, width=28).grid(row = 7,column = 4,padx = 7,pady = 7)

def src_files():
    global src_filename
    src_filename =  filedialog.askdirectory()
    return src_filename
def des_files():
    global des_filename
    des_filename =  filedialog.askdirectory()
    return des_filename
#file transfer
def f_transfer():
    for root,dirs,files in os.walk(src_filename):
        for file_name in files:
            now = datetime.now()
            before = now - timedelta(hours=24)
            files = os.path.join(src_filename, file_name)
            mod_time = datetime.fromtimestamp(os.path.getmtime(files))
            if mod_time > before:
                shutil.move(os.path.join(src_filename, file_name), 
                    des_filename)
                data_entry()  

if __name__ == '__main__':
    datetime_tbl()
    root = Tk()
    root.mainloop
    ui(root)

Tags: importsrcdatetimedefrootfilesfilenameconn
1条回答
网友
1楼 · 发布于 2024-03-28 22:31:15

闭包在这里非常方便,因为这里的数据容器(src_filenamedest_filename)是可变的StringVar对象。在

首先,src_files()和{}可以重构为单个函数。我们不要再使用这些全局变量了。在

def get_file(src_filename):
    def wrap():
        src_filename.set(filedialog.askdirectory())
    return wrap

将以如下方式传递命令:

^{pr2}$

f_transfer也将在src_filename和{}上关闭,因为它同时使用这两个名称。在

def f_transfer(src_filename, des_filename):
    def wrap():
        _src_filename, _des_filename = src_filename.get(), des_filename.get()

        for root,dirs,files in os.walk(_src_filename):
            for file_name in files:
                now = datetime.now()
                before = now - timedelta(hours=24)
                files = os.path.join(_src_filename, file_name)
                mod_time = datetime.fromtimestamp(os.path.getmtime(files))
                if mod_time > before:
                    shutil.move(
                        os.path.join(_src_filename, file_name), 
                        _des_filename
                    )
                    data_entry()
    return wrap

我们将两个名称绑定到f_transfer,然后将其作为btn_ck的命令传递。在

btn_ck = tk.Button(
    text='File Transfer',
    command=f_transfer(src_filename, des_filename)
).grid(
    row=7, column=2, padx=5, pady=5
)

奖金:我们需要在设置完GUI组件后运行主循环!在

if __name__ == '__main__':
    datetime_tbl()
    root = Tk()
    ui(root)
    root.mainloop()

相关问题 更多 >