1月21日(ファイルの入出力, CSV)

ページ名:200121

テキストファイルの保存


import os
import tkinter as tk
from tkinter import filedialog

def save():
    root.filename =  filedialog.asksaveasfilename(initialdir = "/",title = "Save as",filetypes =  [("text file","*.txt")])
    with open(root.filename, 'w') as f:
        f.write(textbox.get("1.0", tk.END)) #textboxの最初から最後までを保存

root = tk.Tk()
root.geometry("400x300") #ウィンドウサイズ
tk.Label(text = "文章を入力してください").pack()
textbox = tk.Text(width = 40, height = 10) #入力フォーム
textbox.pack()
tk.Button(text = "名前を付けて保存", command = save).pack() #ボタンの表示
tk.mainloop()

 

問題:入力フォームの大きさを変えてみましょう
問題:「上書き保存」のボタンをつけましょう。つまり、一度保存したのと同じファイル名で保存するようにします。このボタンは、「名前を付けて保存」が一度押されたら表示するようにしましょう。

テキストファイルの読み込み

import os
import tkinter as tk

from tkinter import filedialog

def selectfile():
    filename = tk.filedialog.askopenfilename(filetypes = [('Text Files', ('.txt'))], initialdir = '/')
    if filename != '':
        with open(filename) as f:
            textdata = f.read()
            tk.Label(text = textdata).pack()

root = tk.Tk()
root.geometry("400x300") #ウィンドウサイズ
tk.Label(text = "テキストファイルを選択してください").pack()
tk.Button(text = "選択", command = selectfile).pack() #ボタンの表示
tk.mainloop()

問題:ファイルを読み込んだ際、ファイル名も表示するようにしましょう。
問題:このプログラムは2回目にファイルを選択すると、1回目の下に追加して表示する仕様になっています。追記ではなくて、上書きで表示するように変更しましょう。

CSV(Comma Separated Values)

カンマ区切りのデータのこと
CSVデータの例
menu.csv

コーヒー, 400, ハンドドリップのコーヒーです
紅茶, 500, 地元産の茶葉を使用しています
チーズケーキ, 350, ボリューム満点の濃厚チーズケーキです
ランチ, 1000, 週替わりメニューにコーヒーが付きます

①メモ帳を起動します

②上記文字列をコピーして貼り付けします

③「名前を付けて保存」で「すべてのファイル」でmenu.csvと名前を付けて保存します

ExcelからCSVファイルを作る方法

①Excelで適当な表を作ります。

②「名前をつけて保存」で「ファイルの種類」をcsvで選択してください
※罫線や書式は保存されません

読み込みの確認
import csv

MENUFILE = 'C:/Users/Hikyaku/Documents/prj/kotorilabo/sample/menu.csv' #それぞれ変更してください

menucsv = open(MENUFILE, encoding='shift-jis')
for row in csv.reader(menucsv):
    print(row)

データを構造化する

import csv

MENUFILE = 'C:/Users/Hikyaku/Documents/prj/kotorilabo/sample/menu.csv' #それぞれ変更してください
 
#csvファイルを読み込む
menucsv = open(MENUFILE, encoding='shift-jis')
menus = {} #menus[メニュー名] = [価格, 説明]
for row in csv.reader(menucsv):
    menus[row[0]] = row[1:] #rowの先頭をキーに、1番地以降を値に設定する

#メニューの検索
menu = input('検索したいメニューは?')
data = menus[menu]
print('価格:' + data[0] + '円, 説明:' + data[1])

tkinterでの表の表示

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
root.geometry("400x300") #ウィンドウサイズ

tree = ttk.Treeview(root)
tree["columns"] = (1,2,3)
tree["show"] = "headings"
tree.column(1,width=100)
tree.column(2,width=50)
tree.column(3,width=200)
tree.heading(1,text="商品名")
tree.heading(2,text="価格")
tree.heading(3,text="説明")
tree.insert("","end",values=('コーヒー',400,'ハンドドリップのコーヒーです'))
tree.insert("","end",values=('紅茶',500,'地元産の茶葉を使用しています'))
tree.insert("","end",values=('チーズケーキ',350,'ボリューム満点の濃厚チーズケーキです'))
tree.insert("","end",values=('ランチ',1000,'週替わりメニューにコーヒーが付きます'))
tree.pack()

root.mainloop()

CSVとtkinterの連携

import os
import tkinter as tk
import tkinter.ttk as ttk

MENUFILE = 'C:/Users/Hikyaku/Documents/prj/kotorilabo/sample/menu.csv' #それぞれ変更してください

root = tk.Tk()
root.geometry("500x300") #ウィンドウサイズ

#表の設定
tree = ttk.Treeview(root)
tree["columns"] = (1,2,3)
tree["show"] = "headings"
tree.column(1,width=100)
tree.column(2,width=50)
tree.column(3,width=200)
tree.heading(1,text="メニュー名")
tree.heading(2,text="価格")
tree.heading(3,text="説明")

#データの読み込み
menucsv = open(MENUFILE, encoding='shift-jis')
for row in csv.reader(menucsv):
    tree.insert("","end",values=row)


tree.pack()

tk.mainloop()

CSVとtkinterの連携②データの追加

import os
import tkinter as tk
import tkinter.ttk as ttk

MENUFILE = 'C:/Users/Hikyaku/Documents/prj/kotorilabo/sample/menu.csv' #それぞれ変更してください

def add_data():
    tree.insert("","end",values=(entry1.get(), entry2.get(), entry3.get()))

root = tk.Tk()
root.geometry("500x400") #ウィンドウサイズ

#表の設定
tree = ttk.Treeview(root)
tree["columns"] = (1,2,3)
tree["show"] = "headings"
tree.column(1,width=100)
tree.column(2,width=50)
tree.column(3,width=200)
tree.heading(1,text="メニュー名")
tree.heading(2,text="価格")
tree.heading(3,text="説明")

#データの読み込み
menucsv = open(MENUFILE, encoding='shift-jis')
for row in csv.reader(menucsv):
    tree.insert("","end",values=row)
tree.pack()

#入力画面の設定
frame1 = tk.Frame(root)
frame1.pack()
tk.Label(frame1,text="商品名").pack(side="left")
entry1 = tk.Entry(frame1)
entry1.pack(side="left")

frame2 = tk.Frame(root)
frame2.pack()
tk.Label(frame2,text="価格").pack(side="left")
entry2 = tk.Entry(frame2)
entry2.pack(side="left")

frame3 = tk.Frame(root)
frame3.pack()
tk.Label(frame3,text="説明").pack(side="left")
entry3 = tk.Entry(frame3)
entry3.pack(side="left")

# 追加ボタンの設定
tk.Button(root,text="追加", command=add_data).pack()

tk.mainloop()

CSVの書き込み

    with open(DATAFILE, 'w', newline = '') as f:
        writer = csv.writer(f)
        for row in data:
            writer.writerow(row)

画像ファイルの読み込み

import os
import tkinter as tk

from tkinter import filedialog

from PIL import Image, ImageTk #画像の処理

def selectfile():
    filename = tk.filedialog.askopenfilename(filetypes = [('Image Files', ('.gif','.png','.jpg'))], initialdir = '/')
    if filename != '':
        canvas = tk.Canvas(width = 400, height = 250)
        canvas.img = ImageTk.PhotoImage(file = filename)
        canvas.pack()
        canvas.create_image(0, 0,image = canvas.img, anchor = tk.NW)

root = tk.Tk()
root.geometry("800x600") #ウィンドウサイズ
tk.Label(text = "画像ファイルを選択してください").pack()
tk.Button(text = "選択", command = selectfile).pack() #ボタンの表示
tk.mainloop()

問題:先ほど同様、このプログラムは2回目にファイルを選択すると、1回目の下に追加して表示する仕様になっています。追記ではなくて、上書きで表示するように変更しましょう。

問題:テキストファイルも表示できるようにボタンを追加しましょう。

お絵描き


import os
import tkinter as tk

root = tk.Tk()
root.geometry("400x300") #ウィンドウサイズ
canvas = tk.Canvas(root, bg="white", width = 300, height = 200)
canvas.create_polygon(10, 10, 10, 100, 100, 100, 100, 10, fill="green") #正方形
canvas.create_line(10, 10, 150, 150, fill='red') #直線
canvas.pack()
root.mainloop()

問題:ボタンを設置し、ボタンを押したら図形が表示されるようにしましょう
問題:画像の読み込みボタンを設置し、画像と図形を重ねて表示できるようにしましょう。

 

参考:画像の保存


import os
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk #画像の処理

def saveimage():
    root.filename =  filedialog.asksaveasfilename(initialdir = "/",title = "Save as",filetypes =  [("PostScript file","*.ps")])
    canvas.postscript(file = root.filename) #psファイルで保存する

root = tk.Tk()
root.geometry("400x300") #ウィンドウサイズ
canvas = tk.Canvas(root, bg="white", width = 300, height = 200)
canvas.create_polygon(10, 10, 10, 100, 100, 100, 100, 10, fill="green") #正方形
canvas.create_line(10, 10, 150, 150, fill='red') #直線
canvas.pack()
tk.Button(text = "保存", command = saveimage).pack() #ボタンの表示
root.mainloop()

 

シェアボタン: このページをSNSに投稿するのに便利です。

コメント

返信元返信をやめる

※ 悪質なユーザーの書き込みは制限します。

最新を表示する

NG表示方式

NGID一覧