tkinter将enter内容加入列表求助
请问怎么将3个文本框的内容加入到列表path_list中?import tkinter as tk
from tkinter.filedialog import askopenfilename
class Files():
def __init__(self, i):
self.etyText = tk.StringVar()
self.name = f'name{i}'
def btn_action(self):
sPath = askopenfilename()
if len(sPath) > 0:
self.etyText.set(sPath)
if __name__ == '__main__':
root = tk.Tk()
root.title('test')
root.geometry('500x200+500+200')
iCount = 3
path_list = []
for i in range(1, iCount + 1):
file = Files(i)# 實例化類
tk.Label(root, text='lb' + str(i)).grid(row=i, column=0)
file.name=tk.Entry(root, textvariable=file.etyText, width=40)
file.name.grid(row=i, column=1)
tk.Button(root, text='選擇文件', command=file.btn_action).grid(row=i, column=2)
path_list.append(file.name.get())
def show_path():
print(path_list)
tk.Button(root, text='Run', command=show_path).grid(row=iCount + 1, column=1)
tk.mainloop()
改成这样:
import tkinter as tk
from tkinter.filedialog import askopenfilename
class Files():
def __init__(self, i):
self.etyText = tk.StringVar()
self.name = f'name{i}'
def btn_action(self):
sPath = askopenfilename()
if len(sPath) > 0:
self.etyText.set(sPath)
path_list.append(sPath)
if __name__ == '__main__':
root = tk.Tk()
root.title('test')
root.geometry('500x200+500+200')
iCount = 3
path_list = []
for i in range(1, iCount + 1):
file = Files(i)# 實例化類
tk.Label(root, text='lb' + str(i)).grid(row=i, column=0)
file.name=tk.Entry(root, textvariable=file.etyText, width=40)
file.name.grid(row=i, column=1)
tk.Button(root, text='選擇文件', command=file.btn_action).grid(row=i, column=2)
def show_path():
print(path_list)
tk.Button(root, text='Run', command=show_path).grid(row=iCount + 1, column=1)
tk.mainloop() qiuyouzhi 发表于 2021-2-3 16:33
改成这样:
这样存在一种问题,就是有一个路径选择两次以上,path_list 中的数量就会超过3个,就没办法一一对应了,
例如第一个选择文件按钮先选了一个文件,然后又选一次, 本帖最后由 Daniel_Zhang 于 2021-2-3 17:00 编辑
不知道有没有解决你的问题嗷,目前我这边测试的是点击了 Run 以后,就可以直接 print 地址了
我直接在按下按钮选择文件的那个 function 里面 append 文件的地址到 list 里
import tkinter as tk
from tkinter.filedialog import askopenfilename
path_list = []
class Files():
def __init__(self, i):
self.etyText = tk.StringVar()
self.name = f'name{i}'
def btn_action(self):
sPath = askopenfilename()
if len(sPath) > 0:
self.etyText.set(sPath)
path_list.append(sPath)
if __name__ == '__main__':
root = tk.Tk()
root.title('test')
root.geometry('500x200+500+200')
iCount = 3
for i in range(1, iCount + 1):
file = Files(i)# 實例化類
tk.Label(root, text='lb' + str(i)).grid(row=i, column=0)
file.name=tk.Entry(root, textvariable=file.etyText, width=40)
file.name.grid(row=i, column=1)
tk.Button(root, text='選擇文件', command=file.btn_action).grid(row=i, column=2)
def show_path():
print(path_list)
tk.Button(root, text='Run', command=show_path).grid(row=iCount + 1, column=1)
tk.mainloop()
其实吧,感觉你这段代码有点复杂就是,看起来有点费眼睛{:10_248:}
from tkinter import *
from tkinter import filedialog
root = Tk()
root.geometry('200x200')
def callback():
fileName = filedialog.askopenfilename()
print(fileName)
Button(root, text = 'Open the file', command = callback).pack()
root.mainloop()
这是小甲鱼课上的一个代码 Daniel_Zhang 发表于 2021-2-3 16:57
不知道有没有解决你的问题嗷,目前我这边测试的是点击了 Run 以后,就可以直接 print 地址了
还是存在跟我在3L说的一样的问题 lengyue869 发表于 2021-2-3 16:59
还是存在跟我在3L说的一样的问题
我不太明白你的意思,我选择了三个同样的文件,最后 print 出来的 list只有三个元素,长度为3 Daniel_Zhang 发表于 2021-2-3 17:02
我不太明白你的意思,我选择了三个同样的文件,最后 print 出来的 list只有三个元素,长度为3
我是想实现path_list中的路径跟3个文本框一一对应,
你先三个文件都选一遍,然后再随便哪个按钮再选第四个文件,那path_list中就有4个路径了,
这样就没办法实现path_list中的路径跟3个文本框一一对应了 lengyue869 发表于 2021-2-3 17:04
我是想实现path_list中的路径跟3个文本框一一对应,
你先三个文件都选一遍,然后再随便哪个按钮再选第四个 ...
那你干脆直接做三个获取文件的 button 然后一个 button 用来 append三个{:10_266:} Daniel_Zhang 发表于 2021-2-3 17:07
那你干脆直接做三个获取文件的 button 然后一个 button 用来 append三个
如果10個呢...{:5_97:} 本帖最后由 Daniel_Zhang 于 2021-2-3 17:15 编辑
lengyue869 发表于 2021-2-3 17:09
如果10個呢...
我想到了,你不是有一个 self.name 嘛,然后 append 进一个 name 列表
列表是按先后顺序的,你每次点击打开文件的 button 以后,检查一下是不是已经有三个文件路径在列表里了
如果是,就获得对应的名字,用 self.name
然后获得 self.name 的值,用值去寻找 name 列表里面对应的元素的位置,然后是 delete 还是什么的删除path_list指定位置的元素,不太记得了,删除掉对应的元素(你看看是不是需要删除 path_list 和 name 的还是只要删除 path_list 的) Daniel_Zhang 发表于 2021-2-3 17:14
我想到了,你不是有一个 self.name 嘛,然后 append 进一个 name 列表
列表是按先后顺序的,你每次 ...
不會,我再研究研究{:5_96:} lengyue869 发表于 2021-2-3 17:44
不會,我再研究研究
import tkinter as tk
from tkinter.filedialog import askopenfilename
# 获得所选的文件的地址
path_list = []
name = []# 存储每一个 file button 的名字
class Files():
def __init__(self, i):
self.etyText = tk.StringVar()
self.name = f'name{i}'
def btn_action(self):
position = -1
sPath = askopenfilename()
if len(sPath) > 0:
self.etyText.set(sPath)
if len(path_list) == 3:
for each in range(len(name)):
if str(self.name) in name:
del name
del path_list
position = each
break # 必须 break 否则 del 后悔出现 list out of range 的问题
if len(path_list) < 3 and position != -1:
path_list.insert(position, sPath)
name.insert(position, str(self.name))
else:
path_list.append(sPath)
name.append(str(self.name))
if __name__ == '__main__':
root = tk.Tk()
root.title('test')
root.geometry('500x200+500+200')
iCount = 3
for i in range(1, iCount + 1):
file = Files(i)# 實例化類
tk.Label(root, text='lb' + str(i)).grid(row=i, column=0)
file.name=tk.Entry(root, textvariable=file.etyText, width=40)
file.name.grid(row=i, column=1)
tk.Button(root, text='選擇文件', command=file.btn_action).grid(row=i, column=2)
def show_path():
print(path_list)
tk.Button(root, text='Run', command=show_path).grid(row=iCount + 1, column=1)
tk.mainloop()
Daniel_Zhang 发表于 2021-2-3 17:48
如果第一个按钮选了两次结果还是不对,
比如:第一个按钮点第一次发现选错了,然后再选一次,就还是没办法对应上了{:5_104:} lengyue869 发表于 2021-2-3 18:25
如果第一个按钮选了两次结果还是不对,
比如:第一个按钮点第一次发现选错了,然后再选一次,就还是没办法对 ...
不可能啊,我试过了{:10_257:} lengyue869 发表于 2021-2-3 18:25
如果第一个按钮选了两次结果还是不对,
比如:第一个按钮点第一次发现选错了,然后再选一次,就还是没办法对 ...
你是不是没点击那个 run
添加了新的以后,点击一下,就会print 一次当前的 path_list
和 Entry 框里面的一模一样啊{:10_245:} Daniel_Zhang 发表于 2021-2-3 18:29
你是不是没点击那个 run
添加了新的以后,点击一下,就会print 一次当前的 path_list
和 Entry 框里面 ...
点了run,如果是先把三个都选一遍,再改其他的就没问题,
如果是先把第一个选两次,再选第二,三个就不行 lengyue869 发表于 2021-2-3 18:35
点了run,如果是先把三个都选一遍,再改其他的就没问题,
如果是先把第一个选两次,再选第二,三个就不行
18行改成这个就可以了,缩进长度和之前的一样
if str(self.name) in name:
直接用 name 列表判断这个按钮有没有被使用过
页:
[1]