首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >文件实现

文件实现
EN

Stack Overflow用户
提问于 2017-07-20 23:53:23
回答 2查看 1.9K关注 0票数 0

我目前正在尝试从我用如下所示的函数“浏览”定义的外部文件中插入数据,而这些数据要在我分成3部分的列表框中实现,外部文件中的数据只是下面显示的一些日期和数字。有人能帮我找出如何在列表框中实现数据,如下图所示。P.S 数据柴油()函数是在我难以解决的列表框中实现文件后,手动获取日期的日期选择。最后,日期列表框必须是整数,如图2.数据文件链接中所示。

第一张图片中的当前结果

结果我需要第二张照片

通过Button 1实现的数据文件图片#3

代码语言:javascript
运行
复制
from Tkinter import *

import tkFont , time
import ttk,csv,sys,os
import Tkinter,tkFileDialog


class Application(Frame):
    def __init__(self,root):
        Frame.__init__(self,root)
        self.root=root
        self.function1()
        self.function2()



    def function1(self):  #tell the machine we are having new widget
        self.frame1 = Frame(self.root)
        self.frame3 = Frame(self.root, bg="lightblue", borderwidth=2, relief=GROOVE)
        self.label1 = Label(self.frame1, text="Upload Acitivity File:")
        self.first_button = Button(self.frame1, text="Button 1",command=self.browse)
        #Start date selector
        self.Sdate = Label(self.frame3, text="Start Date(dd/mm/yy):  ")
        self.Slb = Listbox(self.frame3, width = 6,height = 8,selectmode='multiple',exportselection=0)
        self.Slb2 = Listbox(self.frame3, width=6, height=8,selectmode='multiple',exportselection=0)
        self.Slb3 = Listbox(self.frame3, width=6, height=8,selectmode='multiple',exportselection=0)


    def function2(self): # # tell the machine where our widget will be
        self.frame1.pack()
        self.frame3.pack()
        self.label1.pack(padx=5, pady=10, side=LEFT)
        self.first_button.pack(side=LEFT)
        #start and end date
        self.Sdate.grid(row =0,column=0)
        self.Slb.grid(row =0,column=1)
        self.Slb2.grid(row=0, column=2)
        self.Slb3.grid(row=0, column=3)


    def browse(self):
        file = tkFileDialog.askopenfile(mode='rb', title='Choose a file')
        self.data = csv.reader(file)
        self.datalist = []
        for row in self.data:
            if len(row) != 0:
                self.datalist = self.datalist + [row]
        self.datalist.sort()
        print self.datalist


    def datesel(self):

        # get selected line index
        self.index = self.Slb.curselection()[0]
        # get the line's text
        self.seltext = self.Slb.get(self.index)
        print self.seltext


        self.index2 = self.Slb2.curselection()[0]
        self.seltext2 = self.Slb2.get(self.index2)
        print self.seltext2
        self.index3 = self.Slb3.curselection()[0]
        self.seltext3 = self.Slb3.get(self.index3)
        print self.seltext3

        self.Slist = [self.seltext,self.seltext2,self.seltext3]
        self.Slist.sort(0,END)
        print self.Slist



def main():
    parent=Tk() # main frame
    parent.geometry('600x600+300+30')  #The height and width of the program
    parent.title('Motion Tracker')#assign the title of the program
    app = Application(parent)
    parent.mainloop()#keeps the program running for infinite amount of time
main()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-21 05:58:41

我不明白为什么要将日期、月份和年份放在单独的列表框中,但无论如何,下面的代码显示了如何以第二张图片显示的方式填充3个列表框。我已经将代码压缩到最低限度,并将文件名硬编码到类中,但这很容易修复。

代码语言:javascript
运行
复制
import Tkinter as tk

class Application(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        self.pack()
        self.root = root
        self.do_listboxes()

    def do_listboxes(self):
        tk.Button(self, text="Get dates", command=self.fill_dates).pack()
        self.Slb1 = tk.Listbox(self, width=6, height=8, selectmode='multiple', exportselection=0)
        self.Slb2 = tk.Listbox(self, width=6, height=8, selectmode='multiple', exportselection=0)
        self.Slb3 = tk.Listbox(self, width=6, height=8, selectmode='multiple', exportselection=0)
        self.Slb1.pack(side=tk.LEFT)
        self.Slb2.pack(side=tk.LEFT)
        self.Slb3.pack(side=tk.LEFT)

    def fill_dates(self):
        fname = 'dkebz.txt'
        # Use sets to get rid of duplicated days, months, and years
        days, mons, yrs = set(), set(), set()
        with open(fname, 'r') as f:
            #Skip header
            next(f)
            for row in f:
                # Extract the date from the row
                date = row.split(',')[1]
                # Extract the day, month, and year from the date
                day, mon, yr = date.split('/')
                days.add(day)
                mons.add(mon)
                yrs.add(yr)

            # Populate the list boxes
            for day in sorted(days):
                self.Slb1.insert(tk.END, day)
            for mon in sorted(mons):
                self.Slb2.insert(tk.END, mon)
            for yr in sorted(yrs):
                self.Slb3.insert(tk.END, yr)

def main():
    parent = tk.Tk()
    parent.title('Motion Tracker')
    app = Application(parent)
    parent.mainloop()

main()

我使用的是import Tkinter as tk而不是from Tkinter import *。“星号”导入将175 Tkinter名称放入您的命名空间(在Python 3,136个名称中),这很麻烦,并且可能导致名称冲突,特别是当您进行其他“星星”导入时。使用import Tkinter as tk意味着您必须在每个Tkinter名称之前加上tk.,所以它需要更多的输入,但它使代码更容易阅读,因为每个名称的来源都很清楚。

票数 1
EN

Stack Overflow用户

发布于 2017-07-21 02:03:09

为此,只需修改浏览方法即可。我对数据进行了硬编码,以反映你的文件图像显示的内容。因此,如果数据正是您所提供的,这是可行的。如果它对您有效,请取消注释我注释的2行,并删除我编写的self.data列表定义。

代码语言:javascript
运行
复制
def browse(self):
    file = tkFileDialog.askopenfile(title='Choose a file')
    try:
        with open(file, 'r') as reader:
            self.data = list(reader)
    except:
        raise
    self.datalist = []
    for row in self.data:
        if len(row) != 0 and not row.startswith('Activity'):
            self.datalist = self.datalist + [row]
            activity, date, steps = row.split(',')
            month, day, year = date.split('/')
            self.Slb.insert(END, month)
            self.Slb2.insert(END, day)
            self.Slb3.insert(END, year)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45226887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档