2017-01-11 6 views
-2

私はPythonを、それゆえTkinterを使い慣れません。最初の小さなプロジェクトでは、私はCSVファイルを書くためのプログラムを作成しようとしています。プログラムは起動時にファイル名を取得し、ファイルのヘッダーをチェックし、必要な数の入力フィールドを動的に作成します。Pythonのtkinterグリッドレイアウトが混在しています

入力した最後の行が表示されやすくなります。

現在、私は途中であり、最後の行と正しいエントリウィジェットの数が表示されています。残念ながら、レイアウトはごみです。

Example

私は、ラベルがエントリウィジェットの前面と底面にある[終了]ボタンになると予想しました。

アイデア?

ありがとうございます。

# -*- coding: utf-8 -*- 
import Tkinter as tk 
import argparse 
import time 

parser = argparse.ArgumentParser() 
parser.add_argument('filename', nargs=1, help="file to parse") 
args = parser.parse_args() 

filename = args.filename[0] 


def get_headers(filename): 
    with open(filename, 'r') as f: 
     headers = f.readline() 
    return(headers) 


def file_len(filename): 
    with open(filename) as f: 
     for i, l in enumerate(f): 
      pass 
    return i, l 


class Application(tk.Frame): 

    def __init__(self, headers, filename, last_line, master=None): 
     tk.Frame.__init__(self, master) 
     self.grid() 
     self.filename = filename 
     lastentry = self.createWidgets(self.filename, headers, last_line) 
     # print lastentry 
     # print(lastentry[0].get()) # Test 
     # lastentry[0].delete(0,tk.END) # Test 
     # lastentry[0].insert(0,"Test") # Test 

    def createWidgets(self, filename, headers, last_line): 
     headers = get_headers(filename).split(',') # .decode('utf8') 
     self.lastentry = [] 
     self.entryfield = [] 
     self.label = tk.Label(self, text="CSV Entry Tool").grid(columnspan=3, pady=(0,10)) 
     for x, y in enumerate(headers): 
      self.create_label_widget(x, y) 
     for x, y in enumerate(last_line): 
      self.lastentry.append(self.create_lastentry_widget(x, y)) 
     for x in range(len(last_line)): 
      self.entryfield.append(self.create_entry_widget(x)) 

     self.lastlineLabel = tk.Label(self, text="Last Entry: ").grid(row=2, column=1, padx=(10,10), pady=(0,15)) 
     self.entryLabel = tk.Label(self, text="New Entry: ").grid(row=3, column=1, padx=(10,10), pady=(0,15)) 

     self.quitButton = tk.Button(self, text='Quit', command=self.quit) 
     self.quitButton.grid(row=6, column=6) 
     return self.lastentry 


    def create_label_widget(self, x, y): 
     new_widget = tk.Label(self.master, text=y).grid(row=1, column=x+1, padx=(10,10), pady=(0,15)) 
     return new_widget 

    def create_entry_widget(self, x): 
     new_widget = tk.Entry(self.master) 
     new_widget.grid(row=3, column=x+1, padx=(10,10), pady=(0,15)) 
     return new_widget 

    def create_lastentry_widget(self, x, y): 
     new_widget = tk.Entry(self.master) 
     new_widget.grid(row=2, column=x+1, padx=(10,10), pady=(0,15)) 
     new_widget.insert(1, y) 
     new_widget.configure(state="readonly") 
     return new_widget 

headers = get_headers(filename).split(',') # .decode('utf8') 

print headers 

# Check Filelengh and get back last line. 
file_lengh, last_line = file_len(filename) 
print("Einträge: ".decode('utf8')) + str(file_lengh) 
last_line = last_line.split(',') 
print last_line 


app = Application(headers, filename, last_line) 
app.master.title('Sample application') 
app.mainloop() 
+0

:コード 'VAR =ウィジェット(...)グリッド(...)'グリッド() '' NONE'を返すため 'var'' 'にNONE'を割り当てます - それは2つのステップ 'var = Widget(...)'と 'var.grid(...)'で行うか、必要がない場合は変数をスキップします。 'ウィジェット(...)。 ..) ' – furas

+1

あなたは' self'にラベルとボタンを作成しますが、 'self.master'には他の要素があります。 - それで、それらは独自のグリッドを持つ異なるウィジェットに置くことができます。 – furas

+0

BTW:モジュール 'csv'を使用してcsvファイルを読み込みます。これで、' "(x、y)" 'のように、カンマが1列にあるファイルを間違って読み込みます。 1つの列にあるテキストの中に '\ n 'があ​​る場合にも問題があります。 – furas

答えて

2

あなたはselfにラベルとボタンを作成しますが、self.master内の他の要素 - そう、彼らは独自のグリッドを持っているさまざまなウィジェットにすることができます。

column=x+2selfcolumn=x+1self.masterを変更した後、私はあなたが3で正しいCSV行ので、データを読み取るためにcsvモジュールを使用する必要がありますもvar = Widget(...).grid(...)

var = Widget(...)へと var.grid(...)を変更

enter image description here

を得ました列

"a","b","(x,y)" 

あなたは4列として読んでいます。

そして、あなたはあなたのコードが2行としてこれを読み取りますが、それは正しい1行である\n

"a","b","(x 
y)" 

と同じ問題を抱えていることができます。

コード:BTW

#!/usr/bin/env python2 
# -*- coding: utf-8 -*- 

import Tkinter as tk 
import argparse 
import time 

# --- classes --- 

class Application(tk.Frame): 

    def __init__(self, headers, filename, last_line, master=None): 
     tk.Frame.__init__(self, master) 
     self.grid() 
     self.filename = filename 
     lastentry = self.createWidgets(self.filename, headers, last_line) 
     # print lastentry 
     # print(lastentry[0].get()) # Test 
     # lastentry[0].delete(0,tk.END) # Test 
     # lastentry[0].insert(0,"Test") # Test 

    def createWidgets(self, filename, headers, last_line): 
     headers = get_headers(filename).split(',') # .decode('utf8') 

     self.lastentry = [] 
     self.entryfield = [] 

     self.label = tk.Label(self, text="CSV Entry Tool") 
     self.label.grid(columnspan=3, pady=(0,10)) 

     for x, y in enumerate(headers): 
      self.create_label_widget(x, y) 

     for x, y in enumerate(last_line): 
      self.lastentry.append(self.create_lastentry_widget(x, y)) 

     for x in range(len(last_line)): 
      self.entryfield.append(self.create_entry_widget(x)) 

     self.lastlineLabel = tk.Label(self, text="Last Entry: ") 
     self.lastlineLabel.grid(row=2, column=1, padx=(10,10), pady=(0,15)) 

     self.entryLabel = tk.Label(self, text="New Entry: ") 
     self.entryLabel.grid(row=3, column=1, padx=(10,10), pady=(0,15)) 

     self.quitButton = tk.Button(self, text='Quit', command=self.quit) 
     self.quitButton.grid(row=6, column=4) 

     return self.lastentry 


    def create_label_widget(self, x, y): 
     new_widget = tk.Label(self, text=y) 
     new_widget.grid(row=1, column=x+2, padx=(10,10), pady=(0,15)) 
     return new_widget 

    def create_entry_widget(self, x): 
     new_widget = tk.Entry(self) 
     new_widget.grid(row=3, column=x+2, padx=(10,10), pady=(0,15)) 
     return new_widget 

    def create_lastentry_widget(self, x, y): 
     new_widget = tk.Entry(self) 
     new_widget.grid(row=2, column=x+2, padx=(10,10), pady=(0,15)) 
     new_widget.insert(1, y) 
     new_widget.configure(state="readonly") 
     return new_widget 

# --- functions --- 

def get_headers(filename): 
    with open(filename, 'r') as f: 
     headers = f.readline() 
    return(headers) 

def file_len(filename): 
    with open(filename) as f: 
     for i, l in enumerate(f): 
      pass 
    return i, l 

# --- main --- 

parser = argparse.ArgumentParser() 
parser.add_argument('filename', nargs=1, help="file to parse") 
args = parser.parse_args() 

filename = args.filename[0] 

headers = get_headers(filename).split(',') # .decode('utf8') 

print headers 

# Check Filelengh and get back last line. 
file_lengh, last_line = file_len(filename) 
print("Eintrage: ".decode('utf8')) + str(file_lengh) 
last_line = last_line.split(',') 
print last_line 

app = Application(headers, filename, last_line) 
app.master.title('Sample application') 
app.mainloop() 
+0

ありがとうございます。 – Avarion

関連する問題