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

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

ただいまの
回答率

88.19%

作ったGUIのページ表示機能を改善したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 293

fuji36_om

score 8

前提・実現したいこと

現状:
No1~No3の人物の姓、名、性別、生年月日を表示するGUIを作り
最終的にNo10まで表示できるようにしました。

しかし、No1~No3が表示されている状態で前ボタンを押すと、No8~No10が表示され、
No10が表示されている状態で次ボタンを押すと、何も表示しなくなり、その後前ボタンを押しても表示されません。

実現したいこと:
No1~No3が表示されている場合は前ボタンが動かないように、
No10が表示されている場合は次ボタンが動かないようにしたい。

該当のソースコード

#tkinterのインポート
import tkinter as tk

# ウィンドウを作成
root = tk.Tk()
root.title("Hello, World!") # タイトル
root.geometry("500x300") # サイズ

b = tk.Label(text="コントロール画面")# 文字の出力
b.pack()

#ボタン(前)_前ページを出力
def btn_click1():
    global pageid
    no[pageid] = txt_No11.get()
    print(txt_No11.get())
    clear()
    pageid-=3
    hyoji(pageid)


#ボタン(次)_次ページを出力
def btn_click2():
    global pageid
    no[pageid] = txt_No11.get()
    print(txt_No11.get())
    clear()
    pageid+=3
    hyoji(pageid)

def clear():
    txt_No11.delete(0, tk.END)
    txt_No12.delete(0, tk.END)
    txt_No13.delete(0, tk.END)
    txt_No21.delete(0, tk.END)
    txt_No22.delete(0, tk.END)
    txt_No23.delete(0, tk.END)
    txt_No31.delete(0, tk.END)
    txt_No32.delete(0, tk.END)
    txt_No33.delete(0, tk.END)
    txt_No41.delete(0, tk.END)
    txt_No42.delete(0, tk.END)
    txt_No43.delete(0, tk.END)
    txt_No51.delete(0, tk.END)
    txt_No52.delete(0, tk.END)
    txt_No53.delete(0, tk.END)

def hyoji(index):

    txt_No11.insert(tk.END,no[index])
    txt_No21.insert(tk.END,性[index])
    txt_No31.insert(tk.END,名[index])
    txt_No41.insert(tk.END,性別[index])
    txt_No51.insert(tk.END,生年月日[index])

    index +=1
    txt_No12.insert(tk.END,no[index])
    txt_No22.insert(tk.END,性[index])
    txt_No32.insert(tk.END,名[index])
    txt_No42.insert(tk.END,性別[index])
    txt_No52.insert(tk.END,生年月日[index])

    index +=1
    txt_No13.insert(tk.END,no[index])
    txt_No23.insert(tk.END,性[index])
    txt_No33.insert(tk.END,名[index])
    txt_No43.insert(tk.END,性別[index])
    txt_No53.insert(tk.END,生年月日[index])


# 各種ボタン設定
button1 = tk.Button(root,text='前',command = btn_click1).place(width=50,x=300,y=250)
button2 = tk.Button(root,text='次',command = btn_click2).place(width=50,x=375,y=250)

#buttonX = tk.Button(root,text='リセットボタン',command = btn_clickX).place(x=75,y=250)

# テキスト注釈を表示
lbl_1 = tk.Label(text='No.')
lbl_1.place(x=30, y=50)

lbl_2 = tk.Label(text='姓')
lbl_2.place(x=110, y=50)

lbl_3 = tk.Label(text='名')
lbl_3.place(x=220, y=50)

lbl_4 = tk.Label(text='性別')
lbl_4.place(x=330, y=50)

lbl_5 = tk.Label(text='生年月日')
lbl_5.place(x=400, y=50)

# テキストボックス1(No)
txt_No11 = tk.Entry(width=8)
txt_No11.place(x=30, y=80)

txt_No12 = tk.Entry(width=8)
txt_No12.place(x=30, y=110)

txt_No13 = tk.Entry(width=8)
txt_No13.place(x=30, y=140)


# テキストボックス2(姓)
txt_No21 = tk.Entry(width=12)
txt_No21.place(x=110, y=80)

txt_No22 = tk.Entry(width=12)
txt_No22.place(x=110, y=110)

txt_No23 = tk.Entry(width=12)
txt_No23.place(x=110, y=140)


# テキストボックス3(名前)
txt_No31 = tk.Entry(width=12)
txt_No31.place(x=220, y=80)

txt_No32 = tk.Entry(width=12)
txt_No32.place(x=220, y=110)

txt_No33 = tk.Entry(width=12)
txt_No33.place(x=220, y=140)


# テキストボックス4(性別)
txt_No41 = tk.Entry(width=8)
txt_No41.place(x=330, y=80)

txt_No42 = tk.Entry(width=8)
txt_No42.place(x=330, y=110)

txt_No43 = tk.Entry(width=8)
txt_No43.place(x=330, y=140)


# テキストボックス5(生年月日)
txt_No51 = tk.Entry(width=12)
txt_No51.place(x=400, y=80)

txt_No52 = tk.Entry(width=12)
txt_No52.place(x=400, y=110)

txt_No53 = tk.Entry(width=12)
txt_No53.place(x=400, y=140)

no = ["1","2","3","4","5","6","7","8","9","10"]
性 = ["渡邊","柳川","清野","根本","阿部","稲田","木内","三宅","石村","本郷"]
名 = ["沙樹","和臣","菜緒","駿斗","亜依","和徳","喜雄","美南","比呂","香帆"]
性別 = ["女","男","女","男","女","男","男","女","男","女","男","女"]
生年月日 = ["1988/07/15","1966/09/04","1979/06/08","1992/03/14","1977/04/04",
        "1963/11/06","1972/08/21","1992/11/30","1967/12/07","1965/03/20"]
pageid = 0
hyoji(pageid)

root.mainloop( )

試したこと

if 構文を色々考えて試しましたが、機能しないか、invalid syntaxだったので
添付したデータは削っています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

前/後ボタンでpageidを増減している処理に、pageidがインデックスとしての範囲外の値(負の値や、データの総数以上の値)にならないようにif文を組み込む。

def btn_click1():
    global pageid
    (中略)
    if pageid >= 3:
        pageid -= 3
    hyoji(pageid)

def btn_click2():
    global pageid
    (中略)
    if pageid < len(no) - 3:
        pageid += 3
    hyoji(pageid)

ついでに、データを表示する処理に、インデックスとして範囲外の値だったときはデータにアクセスしないような処理を追加する(noが10のとき、残りの2つのウィジェットの表示で範囲外にアクセスするのを防ぐため)。

def hyoji(index):
    if index >= len(no):
        return
    txt_No11.insert(tk.END, no[index])
    (中略)

    index += 1
    if index >= len(no):
        return
    txt_No12.insert(tk.END, no[index])
    (中略)

    index += 1
    if index >= len(no):
        return
    txt_No13.insert(tk.END, no[index])
    (中略)

付け加えると、ウィジェットの名前は、内容を想像できるようなものにしたほうがいい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る