鱼C论坛

 找回密码
 立即注册
查看: 1520|回复: 16

[已解决]tkinter将enter内容加入列表求助

[复制链接]
发表于 2021-2-3 15:48:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问怎么将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()

最佳答案
2021-2-3 18:52:54
lengyue869 发表于 2021-2-3 18:35
点了run,如果是先把三个都选一遍,再改其他的就没问题,
如果是先把第一个选两次,再选第二,三个就不行

18行改成这个就可以了,缩进长度和之前的一样

if str(self.name) in name:

直接用 name 列表判断这个按钮有没有被使用过
123.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-3 16:33:07 | 显示全部楼层
改成这样:
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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 16:37:39 | 显示全部楼层

这样存在一种问题,就是有一个路径选择两次以上,path_list 中的数量就会超过3个,就没办法一一对应了,
例如第一个选择文件按钮先选了一个文件,然后又选一次,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 16:57:23 | 显示全部楼层
本帖最后由 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()

其实吧,感觉你这段代码有点复杂就是,看起来有点费眼睛
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()

这是小甲鱼课上的一个代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 16:59:53 | 显示全部楼层
Daniel_Zhang 发表于 2021-2-3 16:57
不知道有没有解决你的问题嗷,目前我这边测试的是点击了 Run 以后,就可以直接 print 地址了

还是存在跟我在3L说的一样的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 17:02:06 | 显示全部楼层
lengyue869 发表于 2021-2-3 16:59
还是存在跟我在3L说的一样的问题

我不太明白你的意思,我选择了三个同样的文件,最后 print 出来的 list只有三个元素,长度为3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 17:04:43 | 显示全部楼层
Daniel_Zhang 发表于 2021-2-3 17:02
我不太明白你的意思,我选择了三个同样的文件,最后 print 出来的 list只有三个元素,长度为3

我是想实现path_list中的路径跟3个文本框一一对应,
你先三个文件都选一遍,然后再随便哪个按钮再选第四个文件,那path_list中就有4个路径了,
这样就没办法实现path_list中的路径跟3个文本框一一对应了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 17:07:55 | 显示全部楼层
lengyue869 发表于 2021-2-3 17:04
我是想实现path_list中的路径跟3个文本框一一对应,
你先三个文件都选一遍,然后再随便哪个按钮再选第四个 ...

那你干脆直接做三个获取文件的 button 然后一个 button 用来 append三个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 17:09:10 | 显示全部楼层
Daniel_Zhang 发表于 2021-2-3 17:07
那你干脆直接做三个获取文件的 button 然后一个 button 用来 append三个

如果10個呢...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 17:14:47 | 显示全部楼层
本帖最后由 Daniel_Zhang 于 2021-2-3 17:15 编辑


我想到了,你不是有一个 self.name 嘛,然后 append 进一个 name 列表

列表是按先后顺序的,你每次点击打开文件的 button 以后,检查一下是不是已经有三个文件路径在列表里了

如果是,就获得对应的名字,用 self.name

然后获得 self.name 的值,用值去寻找 name 列表里面对应的元素的位置,然后是 delete 还是什么的删除path_list指定位置的元素,不太记得了,删除掉对应的元素(你看看是不是需要删除 path_list 和 name 的还是只要删除 path_list 的)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 17:44:38 | 显示全部楼层
Daniel_Zhang 发表于 2021-2-3 17:14
我想到了,你不是有一个 self.name 嘛,然后 append 进一个 name 列表

列表是按先后顺序的,你每次 ...

不會,我再研究研究
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 17:48:11 | 显示全部楼层
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[each]:
                    del name[each]
                    del path_list[each]
                    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()

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
lengyue869 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-2-3 18:25:07 | 显示全部楼层

如果第一个按钮选了两次结果还是不对,
比如:第一个按钮点第一次发现选错了,然后再选一次,就还是没办法对应上了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 18:25:48 | 显示全部楼层
lengyue869 发表于 2021-2-3 18:25
如果第一个按钮选了两次结果还是不对,
比如:第一个按钮点第一次发现选错了,然后再选一次,就还是没办法对 ...

不可能啊,我试过了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 18:29:25 | 显示全部楼层
lengyue869 发表于 2021-2-3 18:25
如果第一个按钮选了两次结果还是不对,
比如:第一个按钮点第一次发现选错了,然后再选一次,就还是没办法对 ...

你是不是没点击那个 run
添加了新的以后,点击一下,就会print 一次当前的 path_list
和 Entry 框里面的一模一样啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 18:35:56 | 显示全部楼层
Daniel_Zhang 发表于 2021-2-3 18:29
你是不是没点击那个 run
添加了新的以后,点击一下,就会print 一次当前的 path_list
和 Entry 框里面 ...

点了run,如果是先把三个都选一遍,再改其他的就没问题,
如果是先把第一个选两次,再选第二,三个就不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 18:52:54 | 显示全部楼层    本楼为最佳答案   
lengyue869 发表于 2021-2-3 18:35
点了run,如果是先把三个都选一遍,再改其他的就没问题,
如果是先把第一个选两次,再选第二,三个就不行

18行改成这个就可以了,缩进长度和之前的一样

if str(self.name) in name:

直接用 name 列表判断这个按钮有没有被使用过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 16:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表