前回の続きです。
【前回】
前回はひとまず最低限のメモ帳は作ることができました。
まあこれではWindows10のメモ帳アプリには到底及ばぬほど機能が少なすぎるので少しづつ機能をつけていきましょう。今回はステータスバーです。
CustomTkinterにステータスバーはない
ここで問題が発生しました。なんとCTk(Tkinterも含む)には、StatusBarが存在しません。
wxPythonでは普通に配置できたものが、CTkでは工夫する必要がありそうです。
ということで今回はLabelを使って実装していきたいと思います。
ひとつひとつ付け足すコードを見ていきましょう。
self.statusbar = ctk.CTkLabel(self, text="1行、0列", anchor="e", padx=10)
self.statusbar.pack(side="bottom", fill="x")
まずはここです。見ての通りCTkLabelを使っています。
anchor="e"にすることによって右詰め、またside="bottom"にすることで一番下から配置することができます。
これでまあ疑似的にステータスバーを再現しているわけだ。
self.textbox.bind("<KeyRelease>", self.updatestatus)
self.textbox.bind("<ButtonRelease-1>", self.updatestatus)
もちろんステータスバーを更新するために、キーを押された時と、マウスをクリックされたときに関数を実行するようにバインドします。
そしてその関数がこれです。
def updatestatus(self, event=None):
line,col = self.textbox.index(tk.INSERT).split(".")
self.statusbar.configure(text=str(line) + "行、"+ str(col) + "列")
ここの表示形式はお好みに変えてください。今回はWindows10リスペクトをしています。
ちなみに、キー押時とマウス押時以外にもこの関数を実行する必要があります。新規作成時とファイルを開いた時ですかね。
それを含め、全体のコードは以下のような感じです。
import tkinter as tk
from tkinter import filedialog, messagebox
import customtkinter as ctk
class MyFrame(ctk.CTk):
def __init__(self):
super().__init__()
self.title("メモ帳")
self.geometry("900x600")
self.menubar = tk.Menu(self)
filemenu = tk.Menu(self.menubar, tearoff=0)
filemenu.add_command(label="新規", command=self.newfile)
filemenu.add_command(label="開く...", command=self.openfile)
filemenu.add_command(label="名前を付けて保存...", command=self.saveas)
filemenu.add_command(label="終了", command=self.quit)
self.menubar.add_cascade(label="ファイル", menu=filemenu)
self.config(menu=self.menubar)
self.statusbar = ctk.CTkLabel(self, text="1行、0列", anchor="e", padx=10)#
self.statusbar.pack(side="bottom", fill="x")#
self.textbox = ctk.CTkTextbox(self, wrap="none")
self.textbox.pack(fill="both", expand=True)
self.textbox.bind("<KeyRelease>", self.updatestatus)#
self.textbox.bind("<ButtonRelease-1>", self.updatestatus)#
def newfile(self):
self.textbox.delete("1.0", tk.END)
self.updatestatus()#
def openfile(self):
file = filedialog.askopenfilename()
if file:
f = open(file, "r", encoding="utf-8")
self.textbox.delete("1.0", tk.END)
self.textbox.insert("1.0", f.read())
self.updatestatus()#
f.close()
def saveas(self):
file = filedialog.asksaveasfilename(defaultextension="txt")
if file:
f = open(file, "w", encoding="utf-8")
f.write(self.textbox.get("1.0", tk.END))
f.close()
def updatestatus(self, event=None):
line,col = self.textbox.index(tk.INSERT).split(".")
self.statusbar.configure(text=str(line) + "行、"+ str(col) + "列")
if __name__ == "__main__":
app = MyFrame()
app.mainloop()盲点でした。改行コードや文字コードを表示させる必要もありますね。
悩みましたが、強引に実装するしかなさそうです。
self.sbf = ctk.CTkFrame(self,height=24, corner_radius=0)
self.sbf.pack(side="bottom", fill="x")
self.statusbar1 = ctk.CTkLabel(self.sbf, text="1行、0列", anchor="e", padx=10)
self.statusbar1.pack(side="right")
self.statusbar2 = ctk.CTkLabel(self.sbf, text="UTF-8", anchor="e", padx=10)
self.statusbar2.pack(side="right")
私はこのようにしました。複数のステータスを表示するために複数のラベルを用意し、
それをステータスバー用のフレームに詰め込んでいきます。
Part1で紹介したように、side=というのはどこから詰めていくかというものなので、各Labelのsideをrightにすることで右側から詰めることができます。
一応これで実装できます。
def updatestatus(self, event=None):
line,col = self.textbox.index(tk.INSERT).split(".")
self.statusbar1.configure(text=str(line) + "行、"+ str(col) + "列")
今回は以上です!
0 件のコメント:
コメントを投稿