【问题标题】:Python GUI (Tkinter) file browser and state the file selected on the blankPython GUI (Tkinter) 文件浏览器并在空白处说明选择的文件
【发布时间】:2017-02-09 08:19:34
【问题描述】:

此 GUI 允许用户打开文件浏览器并选择您需要的文件,将其显示在空白字段中,然后在按下打开后打开文件。我是 python 新手,曾尝试将 print tkFileDialog.askopenfilename() 放在 self.filename 中,但这会导致语法错误。请帮忙。谢谢!

我的问题如下: 1) 为什么我的文件浏览器在按“文件浏览器”按钮时打开两次。 2)另外,我如何在文件空白而不是在python命令提示符中说明选择的文件的目录?

我想在以后按确定按钮后打开文件。

from Tkinter import *
import csv
import tkFileDialog
class Window:       
 def __init__(self, master):     
    self.filename=""
    csvfile=Label(root, text="Load File:").grid(row=1, column=0)
    bar=Entry(master).grid(row=1, column=1) 

    #Buttons  
    y=12
    self.cbutton= Button(root, text="OK", command=self.process_csv) #command refer to process_csv
    y+=1
    self.cbutton.grid(row=15, column=3, sticky = W + E)
    self.bbutton= Button(root, text="File Browser", command=self.browsecsv) #open browser; refer to browsecsv
    self.bbutton.grid(row=1, column=3)

 def browsecsv(self):
    from tkFileDialog import askopenfilename
    Tk().withdraw() 
    self.filename = askopenfilename()
    print tkFileDialog.askopenfilename() # print the file that you opened.

 def callback():
    abc = askopenfilename()
    execfile("input.xlsx")

 def process_csv(self):
    if self.filename:
        with open(self.filename, 'rb') as csvfile:
            logreader = csv.reader(csvfile, delimiter=',', quotechar='|')
            rownum=0

            for row in logreader:    
                NumColumns = len(row)        
                rownum += 1

            Matrix = [[0 for x in xrange(NumColumns)] for x in xrange(rownum)] 

root = Tk()
window=Window(root)
root.mainloop()  

【问题讨论】:

  • 因为它打开了两次 - 你打电话给askopenfilename 两次

标签: python user-interface tkinter filebrowse


【解决方案1】:

你的两个问题是相关的。问题出在您的 browsecsv(self) 方法中。您的directory 已经存储在self.filename 中,无需再次调用askopenfilename()。这就是文件浏览器打开两次的原因。此外,要在Entry 中设置文本,您需要为其分配一个文本变量。

self.entryText = StringVar()
self.bar = Entry(root, textvariable=self.entryText ).grid(row=1, column=1)

然后,您可以将其分配给您的方法中的Entry

def browsecsv(self):
   from tkFileDialog import askopenfilename
   Tk().withdraw() 
   self.filename = askopenfilename()
   self.entryText.set(self.filename)

【讨论】:

  • 非常感谢!!顺便问一下,我可以问如何复制加载文件和条目空白行,因为我有一个文件列表,我想在按下文件浏览器后处理这些文件。我尝试在 def__init__ 处使用循环,但不断出错。再次感谢! @Maho
  • 抱歉,我不完全理解...您想复制 GUI 对象(EntryButton 等)或其内容(获得 file 本身)?
  • 抱歉回复晚了。我想复制内容(获得的文件本身);这样我就可以选择多个文件并一次处理它们。 @Maho
  • 仍然不确定你的意思,但我希望this 可能会有所帮助。 @桑迪
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2021-06-11
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多