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

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

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

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

Q&A

解決済

1回答

1474閲覧

一覧で選択した行の値を別画面のテキストボックスにインサートしたい

MATLIB

総合スコア27

Python 3.x

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

0グッド

0クリップ

投稿2020/10/06 13:10

編集2020/10/07 13:18

下記(Aファイル)一覧で選択した行の値はtxt_idとtxt_nameで取得できています。

def selected(self): for item in tree.selection(): print(item, tree.item(item)) d=tree.item(item) txt_id = d['values'][0] txt_name = d['values'][1] print(txt_id) print(txt_name)

取得した値をAファイルのbtn_4を押下してBファイルのテキストボックスに
インサートしてBファイルの画面を表示したいです。

どなたかご教授ください。

#Aファイル import tkinter import tkinter as tk from tkinter import ttk from tkinter import font import psycopg2 import Bファイル # connect postgreSQL conn = psycopg2.connect(必要な情報) # カーソルを取得 cursor = conn.cursor() class itiran(tkinter.Frame): def __init__(self, master=None, **kwargs): super().__init__(master) self.pack() self.master.geometry("400x480") self.master.title("一覧") self.create_widgets() def return_view(self): self.master.destroy() # Create Widgets function def create_widgets(self): # 略 def selected(self): for item in tree.selection(): print(item, tree.item(item)) d=tree.item(item) txt_id = d['values'][0] txt_name = d['values'][1] print(txt_id) print(txt_name) # ラベル作成: font1 = font.Font(self.master,size=10) LBL_1= tkinter.Label(self.master,text='ID:', font=font1) LBL_1.place(x=40, y=30) # ラベルを配置する位置の設定 LBL_2 = tkinter.Label(self.master,text='名:', font=font1) LBL_2.place(x=40, y=70) # ラベルを配置する位置の設定 # テキストボックス txt_kanja_id= tkinter.Entry(self.master,width=30) # ID txt_kanja_id.place(x=100, y=30) txt_kanja_name = tkinter.Entry(self.master,width=30) # 名 txt_kanja_name.place(x=100, y=70) # ボタン作成 btn_4 = tkinter.Button(self.master,text='画面2', width=8) # ボタン設定(text=ボタンに表示するテキスト) btn_4.place(x=100, y=400) # ボタンを配置する位置の設定 btn_end = tkinter.Button(self.master, text='閉じる', width=8, command=self.return_view) # ボタン設定(text=ボタンに表示するテキスト) btn_end.place(x=200, y=400) # ボタンを配置する位置の設定 # ツリービューの作成 frame = tk.Frame(self.master) frame.place(x=40, y=200) # ツリービューの作成 tree = ttk.Treeview(frame, height=8) # ツリービューの配置 tree.grid(row=0, column=0) tree["columns"] = (1, 2) tree["show"] = "headings" tree.column(1, width=120) tree.column(2, width=120) tree.heading(1, text="ID") tree.heading(2, text="名") # ツリービューのスタイル変更 style = ttk.Style() # TreeViewの全部に対して、フォントサイズの変更 style.configure("Treeview", font=("", 10)) # TreeViewのHeading部分に対して、フォントサイズの変更と太字の設定 style.configure("Treeview.Heading", font=("", 10, "bold")) ysb = tk.Scrollbar(frame, orient=tk.VERTICAL, width=16, command=tree.yview) tree.configure(yscrollcommand=ysb.set) ysb.grid(row=0, column=1, sticky='news') # SELECT文の作成 sql = """ SELECT id,name FROM table """ cursor.execute(sql) # SQLの実行結果を取得 for r in cursor.fetchall(): tree.insert("", "end", values=r) print(r) print("終了") # ツリービューの配置 tree.grid(row=0, column=0) tree.bind("<<TreeviewSelect>>",selected) def main(): root = tk.Tk() app = itiran(master=root) app.mainloop() if __name__ == "__main__": main()
#Bファイル import tkinter from tkinter import font import tkinter as tk import Aファイル class gamen2(tkinter.Frame): def __init__(self, master=None, **kwargs): super().__init__(master) self.pack() self.master.geometry("400x300") self.master.title("画面2") self.create_widgets() def return_view(self): self.master.destroy() # Create Widgets function def create_widgets(self): # ラベル作成 font1 = font.Font(self.master, size=10) LBL = tkinter.Label(self.master, text='ID:', font=font1) LBL.place(x=10, y=30) # ラベルを配置する位置の設定 LBL_1 = tkinter.Label(self.master, text='名:', font=font1) LBL_1.place(x=10, y=70) # ラベルを配置する位置の設定 # テキストボックス txt = tkinter.Entry(self.master, width=20) # ID txt.place(x=70, y=30) txt_pw = tkinter.Entry(self.master, width=20) # 名 txt_pw.place(x=70, y=70) btn_end = tkinter.Button(self.master, text='閉じる', width=8, command=self.return_view) # ボタン設定(text=ボタンに表示するテキスト) btn_end.place(x=70, y=150) # ボタンを配置する位置の設定 def main(): root = tk.Tk() app = gamen2(master=root) app.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記(Aファイル)一覧で選択した行の値はtxt_idとtxt_nameで取得できています。

であれば

self.gamen2 = gamen2(tk.Toplevel(), id=txt_id, name=txt_name) として txt_id と txt_name を gamen2 に渡し class gamen2(tkinter.Frame): では create_widgets に **kwargs を #self.create_widgets() self.create_widgets(**kwargs) #def create_widgets(self): def create_widgets(self, **kwargs): と渡して create_widgets 内で txt.insert(tkinter.END,kwargs['id']) txt_pw.insert(tkinter.END,kwargs['name'])

と設定してみてください。

10月19日追記

できたのですが、Bファイルを単独で起動しようとしたときに
txt.insert(tkinter.END, kwargs['id'])
KeyError: 'id'
とエラーがでてしまいます。

すでに解決されているため不要かもしれませんが
「Bファイルを単独で起動」が「 gamen2 を単独で起動」の意味として ID と 名 を空欄で起動する前提で gamen2 を

Python

1def main(): 2 root = tk.Tk() 3 app = gamen2(master=root, id='', name='') 4 app.mainloop() 5 6if __name__ == "__main__": 7 main()

とするか gamen2 生成時のパラメータが id name 以外にないのであれば
app = gamen2(master=root)
は、そのままで、次のようにデフォルト値を持つ引数にする方法もあります。

Python

1class gamen2(tkinter.Frame): 2 #def __init__(self, master=None, **kwargs): 3 def __init__(self, master=None, id='', name=''): 4 ... 5 #self.create_widgets(**kwargs) 6 self.create_widgets(id=id, name=name) 7 ... 8 9def main(): 10 root = tk.Tk() 11 app = gamen2(master=root) 12 app.mainloop() 13 14if __name__ == "__main__": 15 main()

なお、この場合
def create_widgets(self, **kwargs):

def create_widgets(self, id, name):
として create_widgets 内の kwargs も変更した方がバランスは良いかもしれません。

投稿2020/10/17 00:01

編集2020/10/19 09:21
lehshell

総合スコア1147

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

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

MATLIB

2020/10/18 12:34

lehshellさん。 ありがとうございます。 できたのですが、Bファイルを単独で起動しようとしたときに txt.insert(tkinter.END, kwargs['id']) KeyError: 'id' とエラーがでてしまいます。
MATLIB

2020/10/18 12:35

txt.insert(tkinter.END, kwargs['id'])をコメントアウトにしたら、 正常に画面は表示されました。 記載し忘れていたのですが、単独での画面起動も考えていたので ご教授宜しくお願い致します。
MATLIB

2020/10/18 13:01

すみません。 kwargsが{}のときにエラーになっていたので、 IF文で条件分岐したらできました。
lehshell

2020/10/19 09:22

gamen2 の単独起動情報を追記しました。
MATLIB

2020/10/27 04:52

ご回答ありがとうございます。 非常に分かりやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問