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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Tkinter

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

Python

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

Q&A

解決済

2回答

628閲覧

別ファイルのGUIアプリをimportして実行するとラベルが表示されなくなる問題を解決したいです。

mckie

総合スコア2

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Tkinter

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

Python

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

0グッド

0クリップ

投稿2023/03/01 06:43

実現したいこと

tkinterで作成しているmainプログラムのボタンを押すと、別ファイルのタイマープログラムを呼び出すプログラムを作成しています。

前提

タイマープログラム単体で実行すると思った通りのラベルを表示してくれますが、
mainプログラムからタイマーのプログラムを呼びだして実行すると、タイマーの
ラベルが表示されなくなります。
タイマーのラベルを表示できるようにしたいです。わかる方がいましたらご教授お願いします。
タイマープログラム単体で実行すると思った通りのラベルを表示してくれます

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

タイマープログラム単体で動作させた時のGUI表示(通常)↓
イメージ説明

mainプログラムからタイマープログラムを呼び出したときのGUI表示(問題点)↓
mainプログラムからタイマープログラムを呼び出したときのGUI表示(問題点)

エラーは特に出ていません

該当のソースコード(mainプログラム)

python.main.py

1import tkinter as tk 2 3 4class main: 5 def __init__(self) -> None: 6 win = tk.Tk() 7 win.title("main") 8 win.geometry('510x170') 9 Button1= tk.Button(win, text="カウントダウンタイマー",bg="lightgreen",command= self.ctdown).grid() 10 win.mainloop() 11 self.ctdown() 12 13 14 15 def ctdown(self): 16 import countdown 17 18app = main() 19

該当のソースコード(countdownプログラム)

python.countdown.py

1import tkinter as tk 2from tkinter import font 3from tkinter import messagebox 4 5 6class App: 7 def __init__(self, win): 8 self.win = win 9 self.win.title('Timer') 10 self.win.geometry('510x170') 11 self.count = None 12 self.create_widgets() 13 self.create_widgets = None 14 15 16 17 18 19 20 def create_widgets(self): 21 self.win.rowconfigure(0, weight=1) 22 self.win.columnconfigure(0, weight=1) 23 24 self.frame111 = tk.Frame(self.win, width=510,height=170) 25 self.frame111.grid(row=0, column=0, sticky="nsew") 26 tk.Label(self.frame111, text="カウントダウンタイマー",bg="lightgreen").pack(fill=tk.X) 27 tk.Label(self.frame111,text="時間(秒)").pack() 28 self.entry = tk.Entry(self.frame111) 29 self.entry.insert(tk.END,"4")#標準時間 30 self.entry.pack() 31 self.time = tk.StringVar() 32 self.time_init() 33 self.label = tk.Label(self.frame111, textvariable=self.time, relief=tk.SUNKEN, 34 font=("",20),bg='white') 35 self.label.pack(fill=tk.X,pady=10) 36 self.bt000 = tk.Frame(self.frame111) 37 self.bt000.pack() 38 self.font1 = font.Font(family='Helvetica', size=15, weight='bold') 39 40 self.b_start = tk.Button(self.bt000, text='Start', font=self.font1, command=self.start) 41 self.b_stop = tk.Button(self.bt000, text='Stop', font=self.font1, command=self.stop, state=tk.DISABLED) 42 self.b_reset = tk.Button(self.bt000, text='Reset', font=self.font1, command=self.reset, state=tk.DISABLED) 43 44 self.b_start.pack(side=tk.LEFT,ipadx=30, padx=10) 45 self.b_stop.pack(side=tk.LEFT,ipadx=30, padx=10) 46 self.b_reset.pack(side=tk.LEFT,ipadx=30, padx=10) 47 48 def time_init(self): 49 self.time.set("セットする時間を秒単位で入力してください。") 50 51 def time_err(self): 52 self.time.set("不正な入力値です。") 53 54 def time_set(self): 55 self.h = self.count // 3600 56 self.m = (self.count % 3600) // 60 57 self.s = (self.count % 3600) % 60 58 self.time.set("のこり %02d時間 %02d分 %02d秒" % (self.h,self.m,self.s)) 59 60 def start(self): 61 try: 62 if not self.count: 63 self.count = int(self.entry.get()) 64 except: 65 self.time_err() 66 return 67 68 self.started = True 69 self.time_set() 70 if(0 < self.count <= 10): 71 self.label.config(bg="red") 72 self.win.after(1000, self.counting) 73 self.entry.config(state=tk.DISABLED) 74 self.b_start.config(state=tk.DISABLED) 75 self.b_stop.config(state=tk.NORMAL) 76 self.b_reset.config(state=tk.DISABLED) 77 78 def stop(self): 79 self.started = False 80 self.b_start.config(state=tk.NORMAL) 81 self.b_stop.config(state=tk.DISABLED) 82 self.b_reset.config(state=tk.NORMAL) 83 84 def reset(self): 85 self.count = None 86 self.time_init() 87 self.label.config(bg="white") 88 self.b_reset.config(state=tk.DISABLED) 89 self.entry.configure(state=tk.NORMAL) 90 91 def counting(self): 92 if self.started: 93 self.count -=1 94 self.time_set() 95 96 if (0 < self.count <= 10): 97 self.label.config(bg="red") 98 99 if self.count <= 0: 100 self.stop() 101 self.reset() 102 ret = messagebox.askokcancel("完了","タイムアップです" ) 103 if ret == True: 104 self.win.destroy() 105 106 107 self.win.after(1000, self.counting) 108 109 110def main(): 111 win = tk.Tk() 112 App(win) 113 win.mainloop() 114 115app = main() 116

試したこと

google検索
https://teratail.com/questions/318512
上記の記事が似ているような現象でしたので、真似をしてみましたが、私の知識不足で
応用ができませんでした。

補足情報(FW/ツールのバージョンなど)

開発環境はVScodeで作成しております。
この投稿はマルチポストをしております。推奨はされておりませんが
どうしても早く解決をしたいのと、なかなか回答が頂けない為、このような形を取らせていただいております。
マルチポストのURLは以下になります。ご了承お願いいたします。
https://qiita.com/mckie/questions/04ff47a72dc5b7af8804

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

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

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

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

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

hoshi-takanori

2023/03/01 06:54

別ファイルの GUI アプリを単純に import して動かせるようにはできてないのでは…。
melian

2023/03/01 07:00

この main.py ですが、 import countdown の1行だけで十分なのではないでしょうか。
1T2R3M4

2023/03/01 11:36

>どうしても早く解決をしたい 本当に急いでいるのですか。
mckie

2023/03/01 14:07

申し訳ございません、投稿のプログラムではそもそも動かなかったです。本来のプログラムではmain.pyのimport countdownの後にcountdown.main()でインスタンス化をしております。 その時にラベルが表示されなくなります。 また、main.pyにimport countdownだけで十分ではないかとのコメントを頂きましたが、ボタンを押して別ファイルを起動させたいので、このような仕様になっております。 1T2R3M4さん、返信が遅くなり申し訳ございません。すぐに返信くださる皆様にご迷惑掛けないよう私もなるべくレスポンスを早くしたいと思います。
bsdfan

2023/03/01 14:29

全体を追っていないのでわかりませんが、 self.time = tk.StringVar(master=self.win) でmasterを指定してあげるとどうでしょうか?(他にも必要なところがあるかもしれない)
mckie

2023/03/01 14:36

bsdfanさん ありがとうございます。self.time = tk.StringVar(master=self.win)と追記したら表示できるようになりました。 masterがどれなのかわからない状態だったんですね。勉強になりました。ありがとうございます。
guest

回答2

0

自己解決

countdown.pyの
self.time = tk.StringVar()  を
self.time = tk.StringVar(master=self.win) のように
マスターを指定してあげる事で解決しました。

※bsdfanさんコメントにて解決

↓countdown.pyの完成コード

python

1import tkinter as tk 2from tkinter import font 3from tkinter import messagebox 4 5 6class App: 7 def __init__(self, win): 8 self.win = win 9 self.win.title('Timer') 10 self.win.geometry('510x170') 11 self.count = None 12 self.create_widgets() 13 self.create_widgets = None 14 15 16 17 18 19 20 def create_widgets(self): 21 self.win.rowconfigure(0, weight=1) 22 self.win.columnconfigure(0, weight=1) 23 24 self.frame111 = tk.Frame(self.win, width=510,height=170) 25 self.frame111.grid(row=0, column=0, sticky="nsew") 26 tk.Label(self.frame111, text="カウントダウンタイマー",bg="lightgreen").pack(fill=tk.X) 27 tk.Label(self.frame111,text="時間(秒)").pack() 28 self.entry = tk.Entry(self.frame111) 29 self.entry.insert(tk.END,"4")#標準時間 30 self.entry.pack() 31 self.time = tk.StringVar(master=self.win) 32 self.time_init() 33 self.label = tk.Label(self.frame111, textvariable=self.time, relief=tk.SUNKEN, 34 font=("",20),bg='white') 35 self.label.pack(fill=tk.X,pady=10) 36 self.bt000 = tk.Frame(self.frame111) 37 self.bt000.pack() 38 self.font1 = font.Font(family='Helvetica', size=15, weight='bold') 39 40 self.b_start = tk.Button(self.bt000, text='Start', font=self.font1, command=self.start) 41 self.b_stop = tk.Button(self.bt000, text='Stop', font=self.font1, command=self.stop, state=tk.DISABLED) 42 self.b_reset = tk.Button(self.bt000, text='Reset', font=self.font1, command=self.reset, state=tk.DISABLED) 43 44 self.b_start.pack(side=tk.LEFT,ipadx=30, padx=10) 45 self.b_stop.pack(side=tk.LEFT,ipadx=30, padx=10) 46 self.b_reset.pack(side=tk.LEFT,ipadx=30, padx=10) 47 48 def time_init(self): 49 self.time.set("セットする時間を秒単位で入力してください。") 50 51 def time_err(self): 52 self.time.set("不正な入力値です。") 53 54 def time_set(self): 55 self.h = self.count // 3600 56 self.m = (self.count % 3600) // 60 57 self.s = (self.count % 3600) % 60 58 self.time.set("のこり %02d時間 %02d分 %02d秒" % (self.h,self.m,self.s)) 59 60 def start(self): 61 try: 62 if not self.count: 63 self.count = int(self.entry.get()) 64 except: 65 self.time_err() 66 return 67 68 self.started = True 69 self.time_set() 70 if(0 < self.count <= 10): 71 self.label.config(bg="red") 72 self.win.after(1000, self.counting) 73 self.entry.config(state=tk.DISABLED) 74 self.b_start.config(state=tk.DISABLED) 75 self.b_stop.config(state=tk.NORMAL) 76 self.b_reset.config(state=tk.DISABLED) 77 78 def stop(self): 79 self.started = False 80 self.b_start.config(state=tk.NORMAL) 81 self.b_stop.config(state=tk.DISABLED) 82 self.b_reset.config(state=tk.NORMAL) 83 84 def reset(self): 85 self.count = None 86 self.time_init() 87 self.label.config(bg="white") 88 self.b_reset.config(state=tk.DISABLED) 89 self.entry.configure(state=tk.NORMAL) 90 91 def counting(self): 92 if self.started: 93 self.count -=1 94 self.time_set() 95 96 if (0 < self.count <= 10): 97 self.label.config(bg="red") 98 99 if self.count <= 0: 100 self.stop() 101 self.reset() 102 ret = messagebox.askokcancel("完了","タイムアップです" ) 103 if ret == True: 104 self.win.destroy() 105 106 107 self.win.after(1000, self.counting) 108 109 110def main(): 111 win = tk.Tk() 112 App(win) 113 win.mainloop()

投稿2023/03/01 14:46

mckie

総合スコア2

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

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

0

countdown.py の 最後の「app = main()」 を削除して、 main.py の 「import countdown」 の後に countdown.main() を記述するとどうなりますか?

投稿2023/03/01 07:15

TakaiY

総合スコア12781

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

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

mckie

2023/03/01 13:59

すみません、この投稿自体に間違いがあり、投稿のプログラムだとインスタンス化ができていなかったので動かない状態でした。申し訳ございません。 TakaiYさんの言われた通り、やってみましたが、ラベルは表示されませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問