繁体   English   中英

Python 期待预期的 str、字节或 os.PathLike object,而不是 StringVar

[英]Python expecting expected str, bytes or os.PathLike object, not StringVar

好吧,我正在做一个项目,它监视两个选定的文件夹并自动将过去二十四小时内创建或编辑的文件从 Folder_A 移动到 Folder_B。 当用户单击扫描按钮时,它还会手动检查这两个文件夹。 到目前为止,它将 select 这两个文件夹,但是当我单击扫描按钮时,出现此错误。 我将如何修复错误 go? 我的代码在错误下方。 请理解我对 python 还是个新手,所以这里可能有很多非常愚蠢的错误。

 File 
"C:\Users\--\AppData\Local\Programs\Python\Python310\Projects\File_transfer.py", line 63, in <module>
   scan_btn=Button(text="Scan", command = submitFunction())
 File "C:\Users\--\AppData\Local\Programs\Python\Python310\Projects\File_transfer.py", line 34, in submitFunction
   for root, dirs,files in os.walk(origin_path):
 File "C:\Users\quirk\AppData\Local\Programs\Python\Python310\lib\os.py", line 342, in walk
   return _walk(fspath(top), topdown, onerror, followlinks)
TypeError: expected str, bytes or os.PathLike object, not StringVar

我的项目代码:

import tkinter
import tkinter as tk
from tkinter import *
from tkinter import filedialog
import os,time
import datetime
import shutil
import datetime as dt

def browse_button():
    # Allow user to select a directory and store it in global var
    # called origin_path
    global origin_path
    filename = filedialog.askdirectory()
    origin_path.set(filename)
    print(filename)

def browse_button2():
    # Allow user to select a directory and store it in global var
    # called receiving_path
    global receiving_path
    filename = filedialog.askdirectory()
    receiving_path.set(filename)
    print(filename)

def submitFunction() :
    for root, dirs,files in os.walk(origin_path):
        for fname in files:
            path = os.path.join(root, fname)
            st = os.stat(path)
            mtime = dt.datetime.fromtimestamp(st.st_mtime)
            shutil.move(path, dest)
    print('Submit button is clicked.')

root = Tk()
origin_path = StringVar()
receiving_path = StringVar()

#First Browse Button Label
lbl1 = Label(master=root,textvariable=origin_path)
lbl1.grid(row=0, column=1)
#Second Browse Button Label
lbl1_2 = Label(master=root,textvariable=receiving_path)
lbl1_2.grid(row=1, column=1)

lbl1_3 = Label(master=root)
lbl1_3.grid(row=2, column=1)

button = Button(text="Browse", command=browse_button)
button.grid(row=0, column=3)

button2 = Button(text="Browse", command=browse_button2)
button2.grid(row=1, column=3)

scan_btn=Button(text="Scan", command = lambda:submitFunction())
scan_btn.grid(row=2, column=7)

mainloop()

now = dt.datetime.now()
ago = now-dt.timedelta(hours=24)
strftime = "%H:%M %m/%d/%Y"
created = 'origin_path'
dest = 'receiving_path'
file_path = 'file:///'+os.getcwd()+'/' + ''

print("Last modified: %s" % time.ctime(os.path.getmtime(file_path)))
print("Created: %s" % time.ctime(os.path.getctime(file_path)))

for root, dirs,files in os.walk(origin_path):  
    for fname in files:
        path = os.path.join(root, fname)
        st = os.stat(path)    
        mtime = dt.datetime.fromtimestamp(st.st_mtime)
        if mtime > ago:
            print("True:  ", fname, " at ", mtime.strftime("%H:%M %m/%d/%Y"))
            shutil.move(path, dest)

def find_info(): #this first func. works fine.for root, dirs, files in os.walk(created):
    for root, dirs, files in os,walk(origin_path):
        for fname in files:
            path = os.path.join(root, fname)
            st = os.stat(path)
            mtime = dt.datetime.fromtimestamp(st.st_mtime)                          
    if mtime > ago:
        print(True)
    else:
        print(False)

print (find_info())                           
print (move())                               

print (os.listdir(dest))
print (os.listdir(created))

问题是您使用 tkinter StringVar调用os.walk ,但 os.walk 不接受 StringVars; 它只接受 str、bytes 或 os.PathLike 类型的对象(例如pathlib Path 对象)。

您可以使用os.walk(origin_path.get())而不是os.walk(origin_path)来修复错误。 这从 StringVar 获取字符串并将其传递给 os.walk,而不是将 StringVar 直接传递给 os.walk。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM