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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

771閲覧

Pythonで作ったカレンダーのボタンを押すと他のPythonファイルを開く

Himasin

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/11/28 08:46

編集2022/11/29 17:57
コード import sys import tkinter as tk1 import datetime as dt1 import calendar as cl1 def generate_calendar1(y1, m1): global wd1 global cal1 for i1 in range( len(cal1) ): cal1[i1] = "" date1 = dt1.date( y1, m1, 1 ) wd1 = date1.weekday() if wd1 > 5: wd1 = wd1 - 7 cal_max1 = cl1.monthrange( y1, m1 )[1] for i1 in range( cal_max1 ): str1 = str( i1+1 ) i2 = i1 + wd1 + 1 cal1[i2] = str1 def set_calendar1(cal1, btn1): for i1 in range( len(cal1) ): str1 = cal1[i1] btn1[i1]["text"] = str1 def prev_next1( n1 ): global y1 global m1 global btn1 m2 = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ] m1 = m1 + n1 if m1 > 12: y1 = y1 + 1 m1 = 1 elif m1 < 1: y1 = y1 - 1 m1 = 12 label1["text"] = str(m1) label2["text"] = m2[m1-1] label3["text"] = str(y1) generate_calendar1(y1, m1) set_calendar1(cal1, btn1) def btn_click1(): return root = tk1.Tk() root.title(u"iroha_calendar v0.1") root.geometry("755x530+100+100") root["bg"] = "#EEEEE8" label1 = tk1.Label(font=("Meiryo UI",26),anchor=tk1.CENTER, width=2) label1["bg"] = "#EEEEE8" label1.place(x=50, y=3) label2 = tk1.Label(font=("Meiryo UI",10),anchor=tk1.W, width=10) label2["bg"] = "#EEEEE5" label2.place(x=120, y=8) label3 = tk1.Label(font=("Meiryo UI",12),anchor=tk1.W, width=10) label3["bg"] = "#EEEEE8" label3.place(x=120, y=25) label4 = [""]*7 a1 = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" ] for i1 in range( 7 ): label4[i1] = tk1.Label(text=a1[i1], font=("Meiryo UI",9), anchor=tk1.CENTER, width=10) label4[i1]["bg"] = "#EEEEE8" label4[i1].place(x=30+103*i1, y=55) btn1 = [""]*42 for i1 in range( 6 ): for i2 in range( 7 ): fg1 = "#000000" if i2 == 0: bg1 = "#FFF0F0" fg1 = "#FF0000" elif i2 == 6: bg1 = "#F6F0FF" fg1 = "#0000A0" else: bg1 = "#FFFFFF" btn1[i2+7*i1] = tk1.Button(root, font=("Meiryo UI",11), anchor=tk1.NW, bg=bg1, fg=fg1, relief='flat', command=btn_click1) x2 = 20 + 103 * i2 y2 = 75 + i1 * 73 btn1[i2+7*i1].place(x=x2, y=y2, width=100, height=70) btn2 = tk1.Button(root, text="prev", font=("Meiryo UI",11), bg="#D0D0D0", relief='flat', command=lambda:prev_next1(-1) ) btn2.place(x=600, y=10, width=60, height=30) btn3 = tk1.Button(root, text="next", font=("Meiryo UI",11), bg="#D0D0D0", relief='flat', command=lambda:prev_next1(1) ) btn3.place(x=680, y=10, width=60, height=30) now1 = dt1.datetime.now() y1 = now1.year m1 = now1.month d1 = now1.day wd1 = 0 cal1 = [""]*40 prev_next1( 0 ) import tkinter as tk import tkinter.ttk as ttk def search(): text.set("add") # メインフレームの作成と設置 frame = ttk.Frame(root) frame.pack(padx=20,pady=10) # 各種ウィジェットの作成 btn4 = tk1.Button(root, text="add", font=("Meiryo UI",11), bg="#D0D0D0", relief='flat',) btn4.place(x=520, y=10, width=60, height=30) root = tk1.Toplevel() root.title(u"入力画面") root.geometry("755x530+100+100") root["bg"] = "#EEEEE8" root.mainloop()

Pythonでアプリ制作をしています。
2つの機能を別々のファイルで制作しています。
1つ目は、利用者が入力をする画面、もうひとつは、カレンダーと1つ目の画面に飛ぶためのボタンを配置してます。

今、ボタン(button4)から入力画面に飛ぶためのプログラムを作っているのですが、上手く行きません💦
「もし、ボタン4が押されたら入力画面.pyに飛ぶ」というプログラムを教えていただきたいです。
試したこととしては、
import os
btn4=open('入力画面.py')
を試しましたがエラーにはならず、ただ何も実行されませんでした。
ご回答よろしくお願いします

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

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

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

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

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

TakaiY

2022/11/28 11:13 編集

質問の内容では、読んだ人にあなたの書いているプログラムがどのようなものなのかまったくわからないので、「入力画面.pyに飛ぶ」と言われても役に立つアドバイスはできません。 まずは、現状のソースコードを提示しましょう。 質問は編集できますので、ここに貼らないでください。 ソースコードを挿入するときは、コード </> ボタンで出てくる枠の中に貼ると読みやくくできます。
TakaiY

2022/11/28 12:58

これではコードが読めないので、</>コードの挿入ボタンを押すと出てくる枠の中に貼ってください。
Himasin

2022/11/28 14:15

何度もすいません💦これで大丈夫でしょうか?
guest

回答1

0

ベストアンサー

pythonのプログラムで別のpyファイルを起動する方法はありますが、それでは、それは別のプログラムになってしまい、データの受け渡しなどが困難になります。

ここで、ポイントが2つあります。

1つめは、tkinterで複数のウィンドウを開く方法です。
tkで複数のウィンドウを持つプログラムを作る場合、メインのウィンドウ以外のものは、tkinter.Toplevel()というコマンドを使ってつくります。
「tkinter Toplevel」 で検索するといくつも例が出てきます。

2つめは、pythonでプログラムを複数のファイルに分ける方法です。
pythonにはlimportという仕組みがあり、モジュールを読み込むのに使いますが、自分で作ったファイルもモジュールとして読み込んで使うことができます。情報ののやりとりも同様にできます。

ということで、質問の内容についてですが、

  1. 入力画面.py の画面をToplevelで実装する。
    基本的に、tk.Tk()としているところを、 tk.Toplevel() にするだけで画面は作れると思います。

  2. 入力画面.py の内容をモジュールとして実行できるようにして、メインのプログラムでimportして使えるようにする。
    現在は、ファイルを実行すると画面が表示されるようになっていますが、「root = tk1.Tk()」以降も関数化して、表示用の関数(たとえばinput_window()など)を起動すると画面が表示されるようにする。
    メインのプログラム側では、必要なタイミングで入力画面.input_window()を実行すれば画面が表示される。

投稿2022/11/29 02:16

TakaiY

総合スコア12657

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

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

Himasin

2022/11/29 07:09

試したのですが、もし、addを押されたらもうひとつのウィンドウを開くという実行ができません。 ソースコードの後半を書き換えたので、もう一度教えていただきたいです。 初心者なので何度も質問すいません
TakaiY

2022/11/29 08:34

そのようにちょっと直すだけで済むような内容ではありません。 どういうファイル名かわかりませんが、最初に貼ってあるコードの方がサブのウィンドウなので、そちらをToplevelで動くようにし、さらに、importして動くようにする必要があります。
Himasin

2022/11/29 08:57

わかりましたありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問