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

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

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

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

Q&A

解決済

1回答

1732閲覧

PyQt5で複数のメニュー画面をシリーズ的に表示させる時に最初のメニュー画面に戻る方法を教えて頂きたく

Heromi

総合スコア15

Python 3.x

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

0グッド

0クリップ

投稿2018/08/19 05:19

下記のソースコードで、2つのメニュー画面(最初のメニュー画面はInitGUI()で、2番目のメニュー画面はNextMenu()で表示)を用意して、最初のメニュー画面で、button1がクリックされて、welcome()関数に飛び、その中で、quitbutton2が押された時に、最初のメニュー画面(InitGUI()で表示させた画面)に戻るようにしたいのですが、この場合に、どのような関数を使ったらよいのかご教示頂きたく。下記のソースコード中のback()で、BASIC等の言語で使うGOTO文みたいな命令を使いたのですが、Pythonにはそのような命令が無いので、どうしたらよいのか、分からなく。 Pythonに関する初心者的質問ですみません。

Python3

1import sys, openpyxl, json, random 2 3from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QPushButton, QAction, QApplication, QMessageBox, QLabel, QLineEdit 4from PyQt5.QtGui import QFont, QIcon, QPixmap 5from PyQt5.QtCore import QCoreApplication, pyqtSlot 6 7class StartMenu(QWidget): 8 def __init__(self): 9 super().__init__() 10 11 self.title = "Hello" 12 13 self.initGUI() 14 15 self.resize(500, 300) 16 self.move(100, 0) 17 self.show() 18 19 def initGUI(self): 20 self.setWindowTitle(self.title) 21 22 self.button1 = QPushButton('Welcome', self) 23 self.button1.move(230, 120) 24 self.button1.clicked.connect(self.welcome) 25 26 self.quitbutton1 = QPushButton('exit', self) 27 self.quitbutton1.move (230, 200) 28 self.quitbutton1.clicked.connect(QCoreApplication.instance().quit) 29 30 self.button2 = QPushButton('Hello', self) 31 self.button2.move (230, 120) 32 self.button2.hide() 33 34 self.quitbutton2 = QPushButton('quit', self) 35 self.quitbutton2.move (230, 200) 36 self.quitbutton2.hide() 37 38 def welcome(self): 39 self.All_Erase1() 40 self.NextMenu() 41 42 def All_Erase1(self): 43 self.button1.hide() 44 self.quitbutton1.hide() 45 46 def All_Erase2(self): 47 self.button2.hide() 48 self.quitbutton2.hide() 49 50 def NextMenu(self): 51 self.button2.show() 52 self.button2.clicked.connect(self.hello) 53 54 self.quitbutton2.show() 55 #self.quitbutton2.clicked.connect(QCoreApplication.instance().quit) 56 self.quitbutton2.clicked.connect(self.back) 57 58 def hello(self): 59 print("hello") 60 self.All_Erase2() 61 62 def back(self): 63 self.All_Erase2() 64 #ここにどんな関数を使ったらinitGUIで表示させた最初のメニュー画面に戻れるのでしょうか 65 66if __name__ == '__main__': 67 app = QApplication(sys.argv) 68 ex1 = StartMenu() 69 70 sys.exit(app.exec_()) 71

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

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

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

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

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

guest

回答1

0

ベストアンサー

All_Erase1で画面の項目をhideした後に画面の項目を再表示していないのが原因かと。

Python

1self.button1.show() 2self.quitbutton1.show()

この2行を入れれば表示されるようになります。


ここからは提案です。
質問文のコードと回答文の書き方だと画面の項目が増えた時(大体20項目ぐらいでしょうか)に全項目の表示/非表示の状態をプログラマが意識しないといけないので管理しきれなくなります。

一般的なGUIアプリケーションはフレーム(Frame)やウィンドウ(Window)という概念があります。
アプリの中にウィンドウがあり、その中に子ウィンドウがある

イメージ説明

今回の場合はQTabWidgetを使った、メニュー画面の切り替えのサンプルコードを参考資料として投稿します。
画面の項目に対するhide処理が存在しないので、質問文のようなトラブルが原理上発生しえません。

Python

1# -*- coding: utf-8 -*- 2import sys 3from PyQt5.QtCore import QCoreApplication 4from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QTabWidget 5 6 7class StartMenu(QWidget): 8 def __init__(self, parent): 9 super().__init__(parent) 10 self.master = parent 11 self.button1 = QPushButton('Welcome', self) 12 self.button1.move(230, 120) 13 self.button1.clicked.connect(self.welcome) 14 self.quitbutton1 = QPushButton('exit', self) 15 self.quitbutton1.move (230, 200) 16 self.quitbutton1.clicked.connect(QCoreApplication.instance().quit) 17 18 def welcome(self): 19 # 0オリジン 20 self.master.setCurrentIndex(1) 21 22 23class WelcomeMenu(QWidget): 24 25 def __init__(self, parent): 26 super().__init__(parent) 27 self.master = parent 28 self.button2 = QPushButton('Hello', self) 29 self.button2.move(230, 120) 30 31 self.quitbutton2 = QPushButton('quit', self) 32 self.quitbutton2.move(230, 200) 33 self.quitbutton2.clicked.connect(self.quit) 34 35 def quit(self): 36 # 項目を引き継ぎたい時とか Sqlite3でも可能 37 self.master.piyo_piyo("piyo_piyo") 38 self.master.setCurrentIndex(0) 39 40 41class App(QTabWidget): 42 def __init__(self): 43 super().__init__() 44 self.setWindowTitle("Hello") 45 # 1個1個のタブがメニューに対応 46 self.tab1 = StartMenu(self) 47 self.tab2 = WelcomeMenu(self) 48 49 # タブページに追加 50 self.addTab(self.tab1, "StartMenu") 51 self.addTab(self.tab2, "WelcomeMenu") 52 53 # タブパネルのボーダーを削除 54 self.setStyleSheet("QTabWidget::pane { border: 0; }") 55 # タブバーを非表示に(↓をコメントすると動きがわかりやすくなるかも) 56 self.tabBar().hide() 57 self.resize(500, 300) 58 self.move(100, 0) 59 60 def piyo_piyo(self, text): 61 print(text) 62 63 64def main(): 65 app = QApplication(sys.argv) 66 ex1 = App() 67 ex1.show() 68 sys.exit(app.exec_()) 69 70 71if __name__ == '__main__': 72 main()

投稿2018/08/19 07:47

編集2018/08/19 08:09
umyu

総合スコア5846

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

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

Heromi

2018/08/20 05:58

ご回答、そして、ご提案、有難うございます。 特に、ご提案に関して、ご丁寧にご説明して頂いて、本当に有難うございます。 ご提案の中のコードを実行してみて、びっくりしました。 まさしくやりたかった事をズバリ、ご提案して頂いて、目からうろこが落ちた感じです。   今、作っているプログラムをご提案して頂いた方法に修正しようと思います。 本当に感謝しております。 有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問