lengyue869 发表于 2021-2-3 15:48:46

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()


qiuyouzhi 发表于 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()

lengyue869 发表于 2021-2-3 16:37:39

qiuyouzhi 发表于 2021-2-3 16:33
改成这样:

这样存在一种问题,就是有一个路径选择两次以上,path_list 中的数量就会超过3个,就没办法一一对应了,
例如第一个选择文件按钮先选了一个文件,然后又选一次,

Daniel_Zhang 发表于 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()


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

这是小甲鱼课上的一个代码

lengyue869 发表于 2021-2-3 16:59:53

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

还是存在跟我在3L说的一样的问题

Daniel_Zhang 发表于 2021-2-3 17:02:06

lengyue869 发表于 2021-2-3 16:59
还是存在跟我在3L说的一样的问题

我不太明白你的意思,我选择了三个同样的文件,最后 print 出来的 list只有三个元素,长度为3

lengyue869 发表于 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个文本框一一对应了

Daniel_Zhang 发表于 2021-2-3 17:07:55

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

那你干脆直接做三个获取文件的 button 然后一个 button 用来 append三个{:10_266:}

lengyue869 发表于 2021-2-3 17:09:10

Daniel_Zhang 发表于 2021-2-3 17:07
那你干脆直接做三个获取文件的 button 然后一个 button 用来 append三个

如果10個呢...{:5_97:}

Daniel_Zhang 发表于 2021-2-3 17:14:47

本帖最后由 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 的)

lengyue869 发表于 2021-2-3 17:44:38

Daniel_Zhang 发表于 2021-2-3 17:14
我想到了,你不是有一个 self.name 嘛,然后 append 进一个 name 列表

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

不會,我再研究研究{:5_96:}

Daniel_Zhang 发表于 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:
                  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()

lengyue869 发表于 2021-2-3 18:25:07

Daniel_Zhang 发表于 2021-2-3 17:48


如果第一个按钮选了两次结果还是不对,
比如:第一个按钮点第一次发现选错了,然后再选一次,就还是没办法对应上了{:5_104:}

Daniel_Zhang 发表于 2021-2-3 18:25:48

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

不可能啊,我试过了{:10_257:}

Daniel_Zhang 发表于 2021-2-3 18:29:25

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

你是不是没点击那个 run
添加了新的以后,点击一下,就会print 一次当前的 path_list
和 Entry 框里面的一模一样啊{:10_245:}

lengyue869 发表于 2021-2-3 18:35:56

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

点了run,如果是先把三个都选一遍,再改其他的就没问题,
如果是先把第一个选两次,再选第二,三个就不行

Daniel_Zhang 发表于 2021-2-3 18:52:54

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

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

if str(self.name) in name:

直接用 name 列表判断这个按钮有没有被使用过
页: [1]
查看完整版本: tkinter将enter内容加入列表求助