[英]Python Tkinter: pass a function with a variable into a button that calls the function and passing the var into a entry form
這是我第一次在這里提問,請耐心等待。 我正在嘗試制作一個 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)
閉包在這里非常方便,因為這里的數據容器( src_filename
, dest_filename
)是可變的StringVar
對象。
首先, src_files()
和des_files()
可以重構為單個函數。 讓我們不再使用這些全局變量。
def get_file(src_filename):
def wrap():
src_filename.set(filedialog.askdirectory())
return wrap
這將作為按鈕命令傳遞,如下所示:
btn_src = tk.Button(
text='Choose file to send out',
command=get_file(src_filename)
).grid(
row=2, column=2, padx=5, pady=5
)
btn_des = tk.Button(
text='Choose file to send to',
command=get_file(des_filename)
).grid(row=2, column=4, padx=5, pady=5)
f_transfer
還將關閉src_filename
和des_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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.