Python総合学習【グリッド操作編】

表の作成

表を作成する処理について解説します。

ソース

#coding: shift_jis
import tkinter as tk

window = tk.Tk()
window.geometry("400x300")

frame = tk.Frame(window,  relief=tk.GROOVE)
frame.place(x=10, y=10,width=200,height=200)
frame.grid_propagate(0)

headers = ["社員コード", "社員名"]
for col in range(0, len(headers)):
   label_header = tk.Label(frame, width=10)
   label_header["relief"] = "ridge"
   label_header["text"]=headers[col]
   label_header.grid(row=0, column=col)

items = ["社員A","社員B"]
for row in range(0, 2):
   for col in range(0, 2):
      label_item = tk.Label(frame, width=10)
      label_item["background"] = "#ffffff"
      label_item["relief"] = "ridge"
      label_item.grid(row=row+1, column=col)
      if col == 0: label_item["text"] = row + 1
      else: label_item["text"] = items[row]

window.mainloop()

Frame(親, キーワード引数)

フレームのインスタンスを生成します。

セル値の取得

セル値を取得する処理について解説します。

ソース

#coding: shift_jis
import tkinter as tk
from tkinter import messagebox

window = tk.Tk()
window.geometry("400x300")

def label_click(event) :
   children = frame.winfo_children()
   for child in children:
      info = child.grid_info()
      if info["row"] > 0:
         child["background"] = "#ffffff"
   event.widget["background"] = "dodgerblue"
   global label_active
   label_active = event.widget

def button_click() :
   messagebox.showinfo("", label_active.cget("text"))
frame = tk.Frame(window,  relief=tk.GROOVE)
frame.place(x=10, y=10,width=200,height=200)
frame.grid_propagate(0)

headers = ["社員コード", "社員名"]
for col in range(0, len(headers)):
   label_header = tk.Label(frame, width=10)
   label_header["relief"] = "ridge"
   label_header["text"]=headers[col]
   label_header.grid(row=0, column=col)

items = ["社員A","社員B"]
for row in range(0, 2):
   for col in range(0, 2):
      label_item = tk.Label(frame, width=10)
      label_item["background"] = "#ffffff"
      label_item["relief"] = "ridge"
      label_item.bind("<Button>", label_click)
      label_item.grid(row=row+1, column=col)
      if col == 0: label_item["text"] = row + 1
      else: label_item["text"] = items[row]

button = tk.Button(window, text="値取得")
button["command"] = button_click
button.place(x=10, y=250)

window.mainloop()

winfo_children()

子ウィジェットを取得します。

ウィジェット[“background”]= 色

背景色を設定します。

行の追加

行を追加する処理について解説します。

ソース

#coding: shift_jis
import tkinter as tk

window = tk.Tk()
window.geometry("400x300")

def button_click() :
   row_count = frame.grid_size()
   for col in range(2):
      label_item = tk.Label(frame, width=10)
      label_item["background"] = "#ffffff"
      label_item["relief"] = "ridge"
      label_item.grid(row=row_count[1], column=col)
      if col == 0:
         label_item["text"] = row_count[1]
      else:
         label_item["text"] = "社員"+chr(64+row_count[1])

frame = tk.Frame(window,  relief=tk.GROOVE)
frame.place(x=10, y=10,width=200,height=200)
frame.grid_propagate(0)

headers = ["社員コード", "社員名"]
for col in range(0, len(headers)):
   label_header = tk.Label(frame, width=10)
   label_header["relief"] = "ridge"
   label_header["text"]=headers[col]
   label_header.grid(row=0, column=col)

button = tk.Button(window, text="行追加")
button["command"] = button_click
button.place(x=10, y=250)

window.mainloop()

ウィジェット.grid_size()

行列数を取得します。

テーブルデータの表示

テーブルデータを表示する処理について解説します。

ソース

#coding: shift_jis
import tkinter as tk
import win32com.client

window = tk.Tk()
window.geometry("400x300")

def button_click() :
   Cn = win32com.client.Dispatch("ADODB.Connection")
   Cn.ConnectionString = "Provider=SQLOLEDB;" \
          "Data Source=localhost\\SQLExpress;" \
          "Initial Catalog=Database;User ID=sa;Password=sa;"
   Cn.Open()

   strSQL = "SELECT 社員コード, 社員名 FROM 社員マスタ"
   Rs = win32com.client.Dispatch("ADODB.Recordset")
   Rs.CursorLocation = 3
   Rs.Open(strSQL, Cn)

   while not Rs.EOF:
      for col in range(2):
         label_item = tk.Label(frame, width=10)
         label_item["background"] = "#ffffff"
         label_item["relief"] = "ridge"
         label_item.grid(row= Rs.AbsolutePosition, column=col)
         label_item["text"] = Rs.Fields(col).Value
      Rs.MoveNext()

frame = tk.Frame(window,  relief=tk.GROOVE)
frame.place(x=10, y=10,width=200,height=200)
frame.grid_propagate(0)

headers = ["社員コード", "社員名"]
for col in range(0, len(headers)):
   label_header = tk.Label(frame, width=10)
   label_header["relief"] = "ridge"
   label_header["text"]=headers[col]
   label_header.grid(row=0, column=col)

button = tk.Button(window, text="表示")
button["command"] = button_click
button.place(x=10, y=250)

window.mainloop()