2017-07-20 17 views
0

私は現在、以下に示すように、関数 "browse"で定義した外部ファイルからデータを挿入しようとしています。これらのデータは、3つに分割されたリストボックス外部ファイルのデータは、単に以下に示すいくつかの日付と数字です。 以下の図に示すように、リストボックス内のデータをどのように実装すればよいか把握できますか? P.S datesel()関数は、リストボックス内でファイルを実装した後に手動で日付を選択する日付選択です。リストボックス内では、解決するのが苦労しています。最後に日付のリストボックスには、画像に第一画像2. Data file linkPython Tkinterリストボックスファイルの実装

enter image description here現在の結果、私は2番目の画像を必要とする

enter image description here結果

enter image description here

データファイルピクチャ#3ショーとしてのみ整数でなければなりません。ボタン1を介して実装するもの

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

リストボックスはファイルから読み取られたデータを反映しているはずですか?あなたが示すデータは図2(あなたが必要と言うもの)との相関がないからです。それはおそらく答えがまだない理由でしょう。 –

+0

はいリストボックスには、activity_file(datesファイル)の日付が(dd/mm/yy)の形式で入力されている必要があります。この事を理解することはできません....基本的に私はこのデータをフィルタリングする方法を知る必要があり、それをフィルタリングした後、それらのリストボックスの中でそれらを使いやすくする必要があります!@RonNorris – Unix

+0

整数をリストボックスに 'self .slb.insert(0,1) '?これは、リストボックスの一番上の位置に1を挿入します。データの解析は簡単です: 'activity、date、distance = row.split( '、')'を試してみてください。それで、 'day、month、year = date.split( '/')' –

答えて

1

あなたが別のリストボックスには日、月、年たい理由を私は理解していない、とにかく、ここではあなたの第二画像が示した方法で3つのリストボックスを埋める方法を示していますいくつかのコードです。コードを最小限に抑えました。ファイル名をクラスにハードコードしましたが、修正するのは簡単です。

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 *使用しました。 "star"インポートは、Tkinterの名前を(Python 3、136の名前で)あなたのネームスペースにダンプします。これは乱雑で、特に他の "スター"のインポートを行うと、名前の衝突を引き起こす可能性があります。 import Tkinter as tkを使うと、各Tkinter名の先頭にtk.という接頭語を付ける必要があるので、もう少しタイピングが必要になりますが、それぞれの名前の由来が明確であるため、コードを読みやすくなります。

1

Fブラウズメソッドを変更するだけで済みます。私はあなたのファイルイメージが示したものを反映するためにデータをハードコードしました。したがって、データがあなたが提供したものと正確に同じであれば、これは機能します。それがあなたのために働くなら、私がコメントした2行のコメントを外し、私が書いたself.dataリストの定義を削除してください。

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) 
+0

コードが部分的に処理されました。変数selfでデータを手動で変更する必要があります。データはちょっと非効率なので、ファイルから直接データを解析し、リストの中に書き込む方法があります。とにかく努力してくれてありがとう! – Unix

+0

@Unixファイル検索部分を答えに戻しました。 –

+0

TypeError:Unicodeに強制する:必要な文字列またはバッファ、ファイルが見つかりました。 @ ronNorris – Unix

関連する問題