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

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

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

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

Tkinter

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

Q&A

解決済

1回答

27930閲覧

1つのウィンドウで画面遷移を行うには、どうすればよいのか。

threeeverytwo

総合スコア49

Python 3.x

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

Tkinter

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

2グッド

2クリップ

投稿2018/03/06 15:10

前提・実現したいこと

画面1から、画面2に遷移できるようにしたい。(画面1と別にウィンドウが作られるのではなく、画面1のウィンドウに画面2が表示されるようにする。下記のコードは、メインウィンドウとは、別にウィンドウを作っています。)

画面1:
イメージ説明
画面2:
イメージ説明

発生している問題・エラーメッセージ

該当のソースコード

画面1(MainWindow.py)

python

1# -*- coding: utf-8 -*- 2 3#==================================================================================== 4# ライブラリ 5#==================================================================================== 6# GUIを扱う 7import tkinter 8# tkinterよりデザインが良くなる 9from tkinter import ttk 10# 名前入力画面を扱う 11import InputNameWindow as inw 12 13#==================================================================================== 14# 関数定義 15#==================================================================================== 16#------------------------------------------------------------------------------------ 17# startボタンを押したときの処理 18#------------------------------------------------------------------------------------ 19def startCommand(): 20 inw.main() 21 22#==================================================================================== 23# 本体関数 24#==================================================================================== 25# main関数を追加し、スコープを切る 26def main() -> None: 27 # インスタンス生成 28 window = tkinter.Tk() 29 30 # ウィンドウタイトルを決定 31 window.title("WORDPRACTICE") 32 33 # ウィンドウの大きさを決定 34 window.geometry("800x600") 35 36 ### タイトル表示 37 #--- ラベル生成 38 # 空白 39 spaceLabel1 = [tkinter.Label(window, text="") for column in range(10)] 40 spaceLabel2 = [tkinter.Label(window, text="") for column in range(3)] 41 # タイトル 42 titleLabelFont = ("Helevetice", 32, "bold") 43 titleLabel = ttk.Label(window, text="WORDPRACTICE", font=titleLabelFont) 44 45 #--- ラベル配置 46 # 空白 47 for index in range(10): 48 spaceLabel1[index].pack() 49 # タイトル 50 titleLabel.pack() 51 52 ### ボタン表示 53 #--- ボタン生成 54 startButton =\ 55 ttk.Button(window, text=" Start ", command=startCommand) 56 57 #--- ボタン配置 58 # 空白 59 for index in range(3): 60 spaceLabel2[index].pack() 61 # ボタン 62 startButton.pack() 63 64 # プログラムを始める 65 window.mainloop() 66 67#==================================================================================== 68# 本体処理 69#==================================================================================== 70if __name__ == "__main__": 71 main() 72 73

画面2(InputNameWindow.py)

python

1# -*- coding: utf-8 -*- 2 3#==================================================================================== 4# ライブラリ 5#==================================================================================== 6# GUIを扱う 7import tkinter 8# tkinterよりデザインが良くなる 9from tkinter import ttk 10 11#==================================================================================== 12# 関数定義 13#==================================================================================== 14#------------------------------------------------------------------------------------ 15# 16#------------------------------------------------------------------------------------ 17 18#==================================================================================== 19# 本体関数 20#==================================================================================== 21def main() -> None: 22 # インスタンス生成 23 window = tkinter.Tk() 24 25 # ウィンドウタイトルを決定 26 window.title("WORDPRACTICE") 27 28 # ウィンドウの大きさを決定 29 window.geometry("800x600") 30 31 ### 空白 32 #--- ラベル生成 33 spaceLabel1 = [tkinter.Label(window, text="") for column in range(5)] 34 # タイトル 35 titleLabelFont = ("Helevetice", 18) 36 titleLabel =\ 37 ttk.Label(window, text="ユーザー名を入力してください。", font=titleLabelFont) 38 39 #--- ラベル配置 40 # 空白 41 for index in range(5): 42 spaceLabel1[index].pack() 43 # タイトル 44 titleLabel.pack() 45 46 ### フレーム表示 47 #--- フレーム生成 48 frame = ttk.Frame(window) 49 #--- フレーム配置 50 frame.pack() 51 52 ### ユーザー名入力表示 53 #--- ラベル生成 54 # 空白 55 spaceLabel2 = [tkinter.Label(frame, text="") for column in range(3)] 56 57 # ユーザー名 58 userNameLabelFont = ("Helevetice", 14) 59 userNameLabel = ttk.Label(frame, text="ユーザー名:", font=userNameLabelFont) 60 61 #--- ラベル配置 62 # 空白 63 for index in range(3): 64 spaceLabel2[index].grid(row=index, column=0) 65 # ユーザー名 66 userNameLabel.grid(row=4, column=0) 67 68 #--- エントリー生成 69 userName = tkinter.StringVar() 70 userNameEntry = ttk.Entry(frame, textvariable=userName, width=30) 71 72 #--- エントリー配置 73 userNameEntry.grid(row=4, column=1) 74 75 ### ボタン表示 76 #--- ボタン生成 77 okButton = ttk.Button(frame, text=" OK ") 78 79 #--- ボタン配置 80 okButton.grid(row=4, column=3) 81 82 # プログラムを始める 83 window.mainloop() 84
glyzinieh, MM921👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

方法としては

  • 必用な画面分のtkinter.Frameを生成し、Frame上で画面を構成する
  • root(質問で挙げたコード上ではwindow)上に、上記のFrameを重ねて配置する(grid()を使う)
  • ユーザに提示したい画面は最上位層に変更することで画面を切り替える(tkinter.Frame.tkraise()を使う)

となります。

簡単ですが、質問上の2つのコードをマージして対応してみましたので参考にしてください

これ以上ページが増えるようでしたら Frameの生成部の関数を別ける、又はクラス化する をお考えください

Python

1# -*- coding: utf-8 -*- 2 3#==================================================================================== 4# ライブラリ 5#==================================================================================== 6# GUIを扱う 7import tkinter 8# tkinterよりデザインが良くなる 9from tkinter import ttk 10 11#==================================================================================== 12# 関数定義 13#==================================================================================== 14#------------------------------------------------------------------------------------ 15# startボタンを押したときの処理 16#------------------------------------------------------------------------------------ 17def changePage(page): 18 # MainPageを上位層にする 19 page.tkraise() 20 21#==================================================================================== 22# 本体関数 23#==================================================================================== 24# main関数を追加し、スコープを切る 25def main() -> None: 26 # インスタンス生成 27 window = tkinter.Tk() 28 29 # ウィンドウタイトルを決定 30 window.title("WORDPRACTICE") 31 32 # ウィンドウの大きさを決定 33 window.geometry("800x600") 34 35 # ウィンドウのグリッドを 1x1 にする 36 window.grid_rowconfigure(0, weight=1) 37 window.grid_columnconfigure(0, weight=1) 38 39 #-----------------------------------StartPage--------------------------------- 40 ### StartPage用のFrameを生成 41 startPage = tkinter.Frame(window) 42 43 ### タイトル表示 44 #--- ラベル生成 45 # 空白 46 spaceLabel1 = [tkinter.Label(startPage, text="") for column in range(10)] 47 spaceLabel2 = [tkinter.Label(startPage, text="") for column in range(3)] 48 # タイトル 49 titleLabelFont = ("Helevetice", 32, "bold") 50 titleLabel = ttk.Label(startPage, text="WORDPRACTICE", font=titleLabelFont) 51 52 #--- ラベル配置 53 # 空白 54 for index in range(10): 55 spaceLabel1[index].pack() 56 # タイトル 57 titleLabel.pack() 58 59 ### ボタン表示 60 #--- ボタン生成 61 startButton =\ 62 ttk.Button(startPage, text=" Start ", command=lambda : changePage(mainPage)) 63 64 #--- ボタン配置 65 # 空白 66 for index in range(3): 67 spaceLabel2[index].pack() 68 # ボタン 69 startButton.pack() 70 71 #StartPageを配置 72 startPage.grid(row=0, column=0, sticky="nsew") 73 74 #-----------------------------------MainPage--------------------------------- 75 ### MainPage用のFrameを生成 76 mainPage = tkinter.Frame(window) 77 78 ### 空白 79 #--- ラベル生成 80 spaceLabel1 = [tkinter.Label(mainPage, text="") for column in range(5)] 81 # タイトル 82 titleLabelFont = ("Helevetice", 18) 83 titleLabel =\ 84 ttk.Label(mainPage, text="ユーザー名を入力してください。", font=titleLabelFont) 85 86 #--- ラベル配置 87 # 空白 88 for index in range(5): 89 spaceLabel1[index].pack() 90 # タイトル 91 titleLabel.pack() 92 93 ### フレーム表示 94 #--- フレーム生成 95 frame = ttk.Frame(mainPage) 96 #--- フレーム配置 97 frame.pack() 98 99 ### ユーザー名入力表示 100 #--- ラベル生成 101 # 空白 102 spaceLabel2 = [tkinter.Label(frame, text="") for column in range(3)] 103 104 # ユーザー名 105 userNameLabelFont = ("Helevetice", 14) 106 userNameLabel = ttk.Label(frame, text="ユーザー名:", font=userNameLabelFont) 107 108 #--- ラベル配置 109 # 空白 110 for index in range(3): 111 spaceLabel2[index].grid(row=index, column=0) 112 # ユーザー名 113 userNameLabel.grid(row=4, column=0) 114 115 #--- エントリー生成 116 userName = tkinter.StringVar() 117 userNameEntry = ttk.Entry(frame, textvariable=userName, width=30) 118 119 #--- エントリー配置 120 userNameEntry.grid(row=4, column=1) 121 122 ### ボタン表示 123 #--- ボタン生成 124 okButton = ttk.Button(frame, text=" OK ") 125 126 #--- ボタン配置 127 okButton.grid(row=4, column=3) 128 129 # MainPageを配置 130 mainPage.grid(row=0, column=0, sticky="nsew") 131 132 # StartPageを上位層にする 133 startPage.tkraise() 134 135 # プログラムを始める 136 window.mainloop() 137 138#==================================================================================== 139# 本体処理 140#==================================================================================== 141if __name__ == "__main__": 142 main()

投稿2018/03/07 01:27

magichan

総合スコア15898

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

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

threeeverytwo

2018/03/07 07:15

大変勉強になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問