既に同じ質問を3回目となる投稿です、投稿ルール、「編集」、「削除」等の処理方法が今一つ理解不足でご迷惑をかけています。(これからは言い訳です)投稿のコード部分のインデントが質問入力画面では有るにもかかわらず新着の質問で表示させると全て削除され左側揃えとなっています。2回目投稿ではご指摘で<code>で挿入したのですが頭尾にある「'''」を文面作成フォームで削除しました(入力画面ではインデント有)。この為と思われますが投稿の様にすべて左揃えになっていました。
下記文面はコード部分が入力フォームとプレビュー画面ともにインデント有で表示されています。
正常に表示されるようでしたら、よろしくお願いします。
【追記】ご指摘によりPyPostTblの定義を追加してあります
(1) //////// 初心者です。PYTHONでファイルを分割(親子関係で)したいのですがエラーが発生。対策を教えて下さい。
又、修正した方が良い部分があればご指摘ください。
(2) /////// 下記ソースコードは正常に動作します。これをメインプログラム(parent.py)と画面作成部分(child1.py)とボタンクリック動作部分(child2.py)にファイルに分割したい。
(3) 正常に動作する元コード及びエラーが出る三分割後コードは下記の通りです
////////////元コード(original.py):正常に動作する
#*** original.py import tkinter as tk import tkinter.ttk as ttk import sqlite3 class MainWindow(ttk.Frame): def __init__(self, parent): super(MainWindow, self).__init__(parent) self.parent = parent #********画面作成 self.create_notebook() self.pack() def create_notebook(self): # ノートブック self.nb = ttk.Notebook(self) # タブの作成 self.tab1 = tk.Frame(self.nb) self.nb.add(self.tab1, text='入力', padding=3) self.nb.pack(expand=1, fill='both') #*******検索条件ページ画面(タブ1) # ページ表題ラベルの設定 self.label1_1 = tk.Label(self.tab1,text="【検索条件】",font=("",16),height=2) self.label1_1.pack(fill="x") # ふりがなのラベルとエントリーの設定 self.frame1_1 = tk.Frame(self.tab1,pady=10) self.frame1_1.pack() self.label1_1 = tk.Label(self.frame1_1,font=("",14),text="フリガナ") self.label1_1.pack(side="left") self.entry1_1 = tk.Entry(self.frame1_1,font=("",14),justify="center",width=15) self.entry1_1.pack(side="left") # 検索ボタンの設定 self.button1_4 = tk.Button(self.tab1,text="検 索",font("",14),width=5,bg="gray",command=self.show_datalist) self.button1_4.pack() #**********データベース接続 self.conn = sqlite3.connect("PyPostDb.db") self.cur = self.conn.cursor() # ****検索実行ボタンが押された処理 def show_datalist(self): huri = str.strip(self.entry1_1.get()) #*********検索条件文の作成 sql = "SELECT * FROM PyPostTbl WHERE PyPostTbl.Huri LIKE '%" + huri + "%'" # SELECT文で取得した各レコードを繰り返し取得 self.cur.execute(sql) r = self.cur.fetchall() if r==None: self.lblStatus.configure(text="登録データはありません。") else: for row in r: print(row[2],row[4]) def quit(self, event=None): # 終了時の処理 #self.conn.close() self.master.destroy() application = tk.Tk() application.geometry("1000x600") application.title('PyPost') window = MainWindow(application) application.protocol('WM_DELETE_WINDOW', window.quit) application.mainloop()
/////////// エラーとなる三分割後コード(parent.py child1.py child2.py)
///親コード(parent.py)
# ******* parent.py import tkinter as tk import tkinter.ttk as ttk import sqlite3 import child1 as ch1 import child2 as ch2 class MainWindow(ttk.Frame): def __init__(self, parent): super(MainWindow, self).__init__(parent) self.parent = parent #**********データベース接続 self.conn = sqlite3.connect("PyPostDb.db") self.cur = self.conn.cursor() # *********** ここにインポートしたモジュールを置きました ******************* #********画面作成 ch1.create_notebook(self) self.pack() # ****検索実行ボタンが押された処理 ch2.show_datalist(self) def quit(self, event=None): # 終了時の処理 self.conn.close() self.master.destroy() application = tk.Tk() application.geometry("1000x600") application.title('PyPost') window = MainWindow(application) application.protocol('WM_DELETE_WINDOW', window.quit) application.mainloop()
//////子コード1(child1.py)
#**** child1.py import tkinter as tk import tkinter.ttk as ttk import sqlite3 import child2 as ch2 # **********画面作成 def create_notebook(self): # ノートブック self.nb = ttk.Notebook(self) # タブの作成 self.tab1 = tk.Frame(self.nb) self.nb.add(self.tab1, text='入力', padding=3) self.nb.pack(expand=1, fill='both') #*******検索条件ページ画面(タブ1) # ページ表題ラベルの設定 self.label1_1 = tk.Label(self.tab1,text="【検索条件】",font=("",16),height=2) self.label1_1.pack(fill="x") # ふりがなのラベルとエントリーの設定 self.frame1_1 = tk.Frame(self.tab1,pady=10) self.frame1_1.pack() self.label1_1 = tk.Label(self.frame1_1,font=("",14),text="フリガナ") self.label1_1.pack(side="left") self.entry1_1 = tk.Entry(self.frame1_1,font=("",14),justify="center",width=15) self.entry1_1.pack(side="left") # 検索ボタンの設定 self.button1_4 = tk.Button(self.tab1,text="検索",font=("",14),width=5,bg="gray",command=ch2.show_datalist) self.button1_4.pack()
//// 子コード2(child2.py)
# **** child2.py import tkinter as tk import tkinter.ttk as ttk import sqlite3 import child1 as ch1 # ******各種アクション集 def show_datalist(self): huri = str.strip(self.entry1_1.get()) #*********検索条件文の作成 sql = "SELECT * FROM PyPostTbl WHERE PyPostTbl.Huri LIKE '%" + huri + "%'" # SELECT文で取得した各レコードを繰り返し取得 self.cur.execute(sql) r = self.cur.fetchall() if r==None: self.lblStatus.configure(text="登録データはありません。") else: for row in r: print(row[2],row[4])
(4) //////////// 分割前はフォームが表示された後、「フリガナ」を入力し「検索」ボタンをクリックすると結果が表示されます。
これに対し分割後はフォームが表示された後、「フリガナ」を入力する以前に全登録データが表示されます。その後「フリガナ」を入力し「検索」ボタンをクリックすると下記エラーが表示され検索結果は表示されません
raceback (most recent call last):
File "C:\Users\akiteru\AppData\Local\Programs\Python\Python38\lib\tkinter\init.py", line 1883, in call
return self.func(*args)
TypeError: show_datalist() missing 1 required positional argument: 'self'
(5) /////// PyPostTblの定義
DB Browser for SQLiteで表示されるテーブルの定義は下記の通りです。
CREATE TABLE "PyPostTbl" (
"Id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"KuwakeId" INTEGER NOT NULL,
"Name" TEXT NOT NULL,
"Huri" TEXT NOT NULL UNIQUE,
"Add1" TEXT,
"Add2" TEXT,
"Add3" TEXT,
"PostNo" TEXT,
"Tel1" TEXT,
"Tel2" TEXT,
"Email" TEXT,
"Nennga" TEXT,
"Seibo" TEXT,
"Bikou1" TEXT,
"Bikou2" TEXT
);
回答1件
あなたの回答
tips
プレビュー