PythonTkinter截断路径,但作为完整目录打开
以下是我的完整Python代码:PythonTkinter截断路径,但作为完整目录打开,python,tkinter,listdir,tkinter.optionmenu,Python,Tkinter,Listdir,Tkinter.optionmenu,以下是我的完整Python代码: from tkinter import * import glob import os from PIL import Image, ImageTk, ImageGrab import tkinter as tk import pyautogui import datetime #date & time now = datetime.datetime.now() root = tk.Tk() root.title("SIGN OFF") root.m
from tkinter import *
import glob
import os
from PIL import Image, ImageTk, ImageGrab
import tkinter as tk
import pyautogui
import datetime
#date & time
now = datetime.datetime.now()
root = tk.Tk()
root.title("SIGN OFF")
root.minsize(840, 800)
# Add a grid
mainframe = tk.Frame(root)
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
mainframe.pack(pady=100, padx=100)
# Create a Tkinter variable
tkvar = tk.StringVar(root)
# Directory
directory = "C:/Users/eduards/Desktop/work/data/to-do"
choices = glob.glob(os.path.join(directory, "*.jpg"))
tkvar.set('...To Sign Off...') # set the default option
# Dropdown menu
popupMenu = tk.OptionMenu(mainframe, tkvar, *choices)
tk.Label(mainframe, text="Choose your sign off here:").grid(row=1, column=1)
popupMenu.grid(row=2, column=1)
label2 = tk.Label(mainframe, image=None)
label2.grid(row = 4, column = 1, rowspan = 10)
# On change dropdown callback.
def change_dropdown(*args):
""" Updates label2 image. """
imgpath = tkvar.get()
img = Image.open(imgpath)
img = img.resize((240,250))
photo = ImageTk.PhotoImage(img)
label2.image = photo
label2.configure(image=photo)
tk.Button(mainframe, text="Open", command=change_dropdown).grid(row=3, column=1)
def var_states():
text_file = open("logfile.txt", "a")
text_file.write("TIME: %s, USER: %s, One %d, Two %d\n" % (now,os.getlogin(), var1.get(), var2.get()))
text_file.close()
print("One %d, Two %d" % (var1.get(), var2.get()))
var1 = IntVar()
Checkbutton(mainframe, text="Ingredients present in full (any allergens in bold with allergen warning if necessary)", variable=var1).grid(column = 2, row=1, sticky=W)
var2 = IntVar()
Checkbutton(mainframe, text="May Contain Statement.", variable=var2).grid(column = 2, row=2, sticky=W)
var3 = IntVar()
Checkbutton(mainframe, text="Cocoa Content (%).", variable=var3).grid(column = 2, row=3, sticky=W)
var4 = IntVar()
Checkbutton(mainframe, text="Vegetable fat in addition to Cocoa butter", variable=var4).grid(column = 2, row=4, sticky=W)
var5 = IntVar()
Checkbutton(mainframe, text="Instructions for Use.", variable=var5).grid(column = 2, row=5, sticky=W)
var6 = IntVar()
Checkbutton(mainframe, text="Additional warning statements (pitt/stone, hyperactivity etc)", variable=var6).grid(column = 2, row=6, sticky=W)
var7 = IntVar()
Checkbutton(mainframe, text="Nutritional Information Visible", variable=var7).grid(column = 2, row=7, sticky=W)
var8 = IntVar()
Checkbutton(mainframe, text="Storage Conditions", variable=var8).grid(column = 2, row=8, sticky=W)
var9 = IntVar()
Checkbutton(mainframe, text="Best Before & Batch Information", variable=var9).grid(column = 2, row=9, sticky=W)
var10 = IntVar()
Checkbutton(mainframe, text="Net Weight & Correct Font Size.", variable=var10).grid(column = 2, row=10, sticky=W)
var11 = IntVar()
Checkbutton(mainframe, text="Barcode - Inner", variable=var11).grid(column = 2, row=11, sticky=W)
var12 = IntVar()
Checkbutton(mainframe, text="Address & contact details correct", variable=var12).grid(column = 2, row=12, sticky=W)
def user():
user_input = os.getlogin()
tk.Label(mainframe, text = user_input, font='Helvetica 18 bold').grid(row = 0, column = 1)
user()
def save():
# pyautogui.press('alt')
# pyautogui.press('printscreen')
# img = ImageGrab.grabclipboard()
# img.save('paste.jpg', 'JPEG')
var_states()
tk.Button(mainframe, text = "Save", command = save).grid(row = 20, column = 1)
root.mainloop()
当我运行代码时,会有一个jpg文件的下拉列表。当前它显示完整目录,如下所示:
我之前写了一篇关于如何修剪路径的帖子,内容如下:
files = os.listdir("C:/Users/eduards/Desktop/work/data/to-do")
print(files)
但是如果我使用上面的代码,它在单击open
时不会打开路径,因为它没有完整的路径名
我想做的是,为了显示的目的,减少路径名,然后按照原始的完整路径打开图像
例如:
当前下拉菜单显示C:/Users/eduards/Desktop/work/data/to-do/img1.jpg
我想要的结果是img1.jpg
,但是在后台打开上面的整个路径
复制评论:这是我尝试过的
directory = os.path.splitdrive("C:/Users/eduards/Desktop/work/data/to-do")
choices = glob.glob(os.path.join(directory[1:], "*.jpg"))
,但是说
expected str, bytes or os.Pathlike, not tuple.
添加了[1://code>,因为路径被拆分为2并返回其第2部分
问题:仅在选项菜单
中显示文件名,但从选择中获取原始完整路径
class FileNameOptionMenu(tk.OptionMenu):
def __init__(self, parent, directory, extension, callback):
创建您自己的选项菜单
,该菜单保存所有图像在dict
中的完整路径,并仅显示文件名作为选项
class FileNameOptionMenu(tk.OptionMenu):
def __init__(self, parent, directory, extension, callback):
通过继承(tk.OptionMenu)
class FileNameOptionMenu(tk.OptionMenu):
def __init__(self, parent, directory, extension, callback):
从所有图像获取完整路径并提取文件名
使用文件名
作为键
并将完整路径作为值
保存在目录中。
# Save result from `glob` in a `dict`
self.glob = {}
for fpath in glob.glob(os.path.join(directory, "*.{}".format(extension))):
filename, extension = os.path.splitext(os.path.split(fpath)[1])
self.glob[filename] = fpath
定义一个变量,该变量保存所选选项供以后使用。
使用目录中键的列表
初始化继承的tk.选项菜单
class FileNameOptionMenu(tk.OptionMenu):
def __init__(self, parent, directory, extension, callback):
将类方法self.command
作为command=
传递
保存回调
,供以后使用
self.selected = tk.StringVar(parent, 'Select a image...')
super().__init__(parent, self.selected, *list(self.glob),
command=self.command)
self.callback = callback
此类方法
在每次单击选项选择时都会被调用。
调用时,它调用self.callback
,即ImageLabel.configure
,并使用所选选项的完整路径。
def command(self, val):
self.callback(image=self.glob.get(self.selected.get()))
通过继承(tk.Label)
,定义您自己的小部件ImageLabel
这个类扩展了tk.Label.configure
来处理.configure(image=
而不是.configure(image=
)。
重载继承的类方法tk.Label.configure
捕获name参数image=
,并用image对象替换传递的完整路径
def configure(self, **kwargs):
key = 'image'
if key in kwargs:
# Replace the filepath with the image
fpath = kwargs[key]
img = Image.open(fpath)
img = img.resize((240, 250))
self._image = ImageTk.PhotoImage(img)
kwargs[key] = self._image
调用原始的tk.Label。配置以显示图像
super().configure(**kwargs)
用法:
用Python测试:3.5…将目录添加回imgpath
?您可以控制打开的内容。使用dict
将文件名映射到完整路径。了解class
和def
之间的区别?class
是一个OOP
术语,用于OOP
p编程。使用类继承
可以根据您自己的需要扩展默认的类
,例如tk.Label
。def
是函数式编程的函数。