質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

2回答

357閲覧

pythonのtksheetでのバインド機能の使用方法

akiteru

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2024/02/22 09:38

実現したいこと

pythonのtksheetを使ってexcelみたいの表を作成したい。
コードを表の外観等を規定する部分と入力値の検証等の部分の2ファイルに分割したい。

発生している問題・分からないこと

下記の第1案a_0.pyの様に一つのファイルに全て書くとコード中のcell_select関数は希望通り動作します。このcell_select関数を別ファイルにした第2案a_1.py,a_2.pyでは File "C:\PyPost\a_2.py", line 3, in cell_select
current_selection = self.sheet.get_currently_selected()
KeyError: 'sheet'のエラー発生しprint("aaaaaaa")部分も実行されません。

該当のソースコード

第1案 a_0.py from tksheet import Sheet import tkinter as tk class demo(tk.Tk): def __init__(self): tk.Tk.__init__(self) self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(0, weight=1) self.frame = tk.Frame(self) self.frame.grid_columnconfigure(0, weight=1) self.frame.grid_rowconfigure(0, weight=1) self.sheet = Sheet(self.frame, data=[[f"Row {r}, Column {c}\nnewline1\nnewline2" for c in range(50)] for r in range(500)]) self.sheet.enable_bindings( "single_select", "rc_select", ) self.sheet.extra_bindings("cell_select", self.cell_select) self.frame.grid(row=0, column=0, sticky="nswe") self.sheet.grid(row=0, column=0, sticky="nswe") def cell_select(self, event=None): current_selection = self.sheet.get_currently_selected() print(current_selection) app = demo() app.mainloop() ------------------------------------- 第2案 a_1.py from tksheet import Sheet import tkinter as tk import a_2 class demo(tk.Tk): def __init__(self): tk.Tk.__init__(self) self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(0, weight=1) self.frame = tk.Frame(self) self.frame.grid_columnconfigure(0, weight=1) self.frame.grid_rowconfigure(0, weight=1) self.sheet = Sheet(self.frame, data=[[f"Row {r}, Column {c}\nnewline1\nnewline2" for c in range(50)] for r in range(500)]) self.sheet.enable_bindings( "single_select", "rc_select", ) self.sheet.extra_bindings("cell_select", a_2.cell_select) self.frame.grid(row=0, column=0, sticky="nswe") self.sheet.grid(row=0, column=0, sticky="nswe") app = demo() app.mainloop() -------------------- a_2.py def cell_select(self, event=None): print("aaaaaaa") current_selection = self.sheet.get_currently_selected() print(current_selection) print("bbbbbbb")

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ネットではtksheetの情報がほとんどありませんでした。
Excelの様に外枠が有り、行名、列名等が設定でき、行、列サイズ等も設定できる他のモジュールが有れば紹介ください

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2024/02/22 09:51

self.sheet.extra_bindings("cell_select", a_2.cell_select) を、以下に置き換えてみて下さい。 self.sheet.extra_bindings("cell_select", lambda _: a_2.cell_select(self))
akiteru

2024/02/23 02:24

コメントありがとうございます。(self)追加を試しましたがまだ解決できていません。 追加すると、画面表示と同時に aaaaaaa () bbbbbbb が表示されます。その後いろいろセルをクリックしても何の反応もありません。 試した結果を質問に追記しました。
melian

2024/02/23 02:53

手元の環境は Python 3.11.6/tksheet 6.3.5 ですが、例えば 5A のセルをクリックすると、 aaaaaaa CurrentlySelectedClass(row=4, column=0, type_='cell') bbbbbbb と表示されます。
akiteru

2024/02/23 06:02

コメントありがとうございます。 大変失礼しました。大成功です! self.sheet.extra_bindings("cell_select", lambda _: a_2.cell_select(self))の 末尾の(self)のみ追加しトライしました。lambda _に気が付きませんでした。 重ねて、ありがとうございました
guest

回答2

0

通常、クラスのメソッドは、クラスの中に含めなくてはならないので、メソッドの定義を別のファイルにすることはできません。

a_2.pyを使った方法は、以下のように書いたものと同じになり、cell_selectは、 demoクラスのメソッドではなくて通常の関数になってしまいます。
引数にselfがあることは関係ありません。(メソッドの1番目の引数名をselfとするのは言語としての決まりではありません)

python

1class demo(tk.Tk): 2 def __init__(self): 3 ## __略__ 4 5# 注) インデントがない 6def cell_select(self, event=None): 7 current_selection = self.sheet.get_currently_selected() 8 print(current_selection)

コードを表の外観等を規定する部分と入力値の検証等の部分の2ファイルに分割したい。

を優先するのであれば、クラスを分割するか、いっそクラスにしないのがいいのではないかと思います。

投稿2024/02/22 12:52

TakaiY

総合スコア12781

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akiteru

2024/02/23 06:09

ご指摘ありがとうございました。初心者の為、classとかdef __init__(self):の概念が今一つ理解不足です。再度トライしてみます。
guest

0

ベストアンサー

cell_select関数を別ファイルにした第2案

a_2 モジュールで定義されている関数をインスタンスメソッドとして demo クラスのインスタンスに登録するという方法も考えられます。

python

1from tksheet import Sheet 2import tkinter as tk 3import a_2 4from functools import partial 5from inspect import getmembers, isfunction 6 7class demo(tk.Tk): 8 def __init__(self): 9 tk.Tk.__init__(self) 10 11 # add functions defined in a_2 module as a method 12 for name, func in getmembers(a_2, isfunction): 13 setattr(self, name, partial(func, self)) 14 15 self.grid_columnconfigure(0, weight=1) 16 self.grid_rowconfigure(0, weight=1) 17 self.frame = tk.Frame(self) 18 self.frame.grid_columnconfigure(0, weight=1) 19 self.frame.grid_rowconfigure(0, weight=1) 20 self.sheet = Sheet(self.frame, 21 data=[[f"Row {r}, Column {c}\nnewline1\nnewline2" for c in range(50)] for r in range(500)]) 22 self.sheet.enable_bindings( 23 "single_select", 24 "rc_select", 25 ) 26 self.sheet.extra_bindings("cell_select", self.cell_select) 27 self.frame.grid(row=0, column=0, sticky="nswe") 28 self.sheet.grid(row=0, column=0, sticky="nswe") 29 30app = demo() 31app.mainloop()

投稿2024/02/23 05:30

melian

総合スコア19840

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問