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

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

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

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

button

HTMLで用いる<button>タグです。

Python

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

Q&A

解決済

2回答

1787閲覧

【Python】tkinterとwebbrowserで作る出退勤アプリのGUIを変更したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Tkinter

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

button

HTMLで用いる<button>タグです。

Python

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

0グッド

0クリップ

投稿2021/06/27 23:57

前提・実現したいこと

【Python】tkinterとwebbrowserで作る出退勤アプリのGUIを変更したい。

昨日、
こちら記事 (tkinterとwebbrowserでデスクトップアプリを作成しよう(初心者向け) Python
を見つけて、初めてPythonをやってみようと思い立ったのですが、ボタンの大きさと配置が気に入りません。
添付画像の左が現実で、理想が右です。

イメージ説明

forで生成されているボタンの、特定のものだけ大きさと配置を変えたいのですが、可能でしょうか?
2番目と3番目のボタン(休憩ボタン)だけ幅を狭めて、横並びにしたいです。

該当のソースコード

Python

1import pyperclip 2import tkinter 3import webbrowser 4import calendar 5 6 7''' 8曜日判定 9 10月 火 水 木 金 土 日 110 1 2 3 4 5 6 12''' 13 14#曜日を用意 15import datetime 16WD = "" 17weekday = datetime.date.today().weekday() 18#print(weekday) 19if weekday == 4: 20 print("今日は金曜です") 21 WD = "※今日は金曜です※" 22else: 23 print("金曜以外") 24 WD = "" 25 26#曜日判定ここまで 27 28 29class ShortCutButton(tkinter.Button): 30 ''' 31 登録したurlをブラウザで開くボタンを生成 32 clipwordを登録すると、登録した文字をクリップボードにコピー(任意) 33 ''' 34 35 def __init__(self, title, url, clipword=None, master=None): 36 super().__init__(master, width=15, text=title, command=self.button_clicked) 37 self.url = url 38 self.clipword = clipword 39 40 def button_clicked(self): 41 if self.clipword: 42 pyperclip.copy(self.clipword) # clipwordをコピー 43 44 if self.url: 45 webbrowser.open(self.url) # urlをブラウザで開く 46 47 48if __name__ == '__main__': 49 #ボタン、url、コピーする文字列のリスト 50 word_list = [ 51 [ 52 "出勤", 53 "https://mail.google.com/mail/", 54 "おはようございます\n出勤いたします\n本日もよろしくお願いいたします" 55 ], 56 [ 57 "in休憩", 58 "https://mail.google.com/mail/", 59 "お疲れ様です(bow)\n休憩いただきます。" 60 ], 61 [ 62 "out休憩", 63 "https://mail.google.com/mail/", 64 "只今休憩より戻りました。" 65 ], 66 [ 67 "退勤", 68 "https://mail.google.com/mail/", 69 "おつかれさまです\n退勤いたします\n明日もよろしくお願いいたします" 70 ], 71 [ 72 "退勤(金)", 73 "https://mail.google.com/mail/", 74 "退勤いたします\n\n来週もよろしくお願いいたします" 75 ], 76 ] 77 78 root = tkinter.Tk() 79 80 root.title('お時間ですよ') 81 root.geometry('500x300+500+300') 82 83 message = tkinter.Message(root, text=WD, font=( 84 "MyricaM M", 20), fg='#ff0000', width=500) 85 message.pack(fill=tkinter.BOTH) 86 87 #ボタンを生成 88 #ここで生成される5つのボタンのうち、2つめと3つめのボタンだけサイズと配置を変えたい 89 for info in word_list: 90 button = ShortCutButton(*info) 91 button.config(bg='#F0F8FF') 92 button.pack(expand=1, fill=tkinter.BOTH, padx=10, pady=10) 93 root.mainloop() 94

試したこと

調べてみたところ、左右にボタンを配置するのは、
button.pack(side=tk.LEFT)
button.pack(side=tk.RIGHT)
というのが出てきたのですが、具体的にどこをどう変更したらいいのかが検討つきません。

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

OS windows10
Python 3.9
vscodeで書きました

不足情報があれば、ご指摘お願いします
わかる範囲で捕捉します

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

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

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

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

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

guest

回答2

0

ベストアンサー

試しに書き換えてみました。
ちょっと大工事になってしまっている気がしますが…

python

1import pyperclip 2import tkinter 3import webbrowser 4import calendar 5 6 7''' 8曜日判定 9 10月 火 水 木 金 土 日 110 1 2 3 4 5 6 12''' 13 14#曜日を用意 15import datetime 16WD = "" 17weekday = datetime.date.today().weekday() 18#print(weekday) 19if weekday == 4: 20 print("今日は金曜です") 21 WD = "※今日は金曜です※" 22else: 23 print("金曜以外") 24 WD = "" 25 26#曜日判定ここまで 27 28 29class ShortCutButton(tkinter.Button): 30 ''' 31 登録したurlをブラウザで開くボタンを生成 32 clipwordを登録すると、登録した文字をクリップボードにコピー(任意) 33 ''' 34 35 def __init__(self, title, url, clipword=None, master=None): 36 super().__init__(master, width=15, text=title, command=self.button_clicked) 37 self.url = url 38 self.clipword = clipword 39 40 def button_clicked(self): 41 if self.clipword: 42 pyperclip.copy(self.clipword) # clipwordをコピー 43 44 if self.url: 45 webbrowser.open(self.url) # urlをブラウザで開く 46 47 48if __name__ == '__main__': 49 #ボタン、url、コピーする文字列のリスト 50 # group を追加しました。これはグループ化するかしないかを判別する文字列です。 51 # groupが同じ文字列の項目が連続している場合、横並びになります。 52 word_list = [ 53 { 54 "group": None, 55 "buttonInfo": [ 56 "出勤", 57 "https://mail.google.com/mail/", 58 "おはようございます\n出勤いたします\n本日もよろしくお願いいたします" 59 ] 60 }, 61 { 62 "group": "A", 63 "buttonInfo": [ 64 "in休憩", 65 "https://mail.google.com/mail/", 66 "お疲れ様です(bow)\n休憩いただきます。" 67 ] 68 }, 69 { 70 "group": "A", 71 "buttonInfo": [ 72 "out休憩", 73 "https://mail.google.com/mail/", 74 "只今休憩より戻りました。" 75 ], 76 }, 77 { 78 "group": None, 79 "buttonInfo": [ 80 "退勤", 81 "https://mail.google.com/mail/", 82 "おつかれさまです\n退勤いたします\n明日もよろしくお願いいたします" 83 ] 84 }, 85 { 86 "group": None, 87 "buttonInfo": [ 88 "退勤(金)", 89 "https://mail.google.com/mail/", 90 "退勤いたします\n\n来週もよろしくお願いいたします" 91 ], 92 } 93 ] 94 95 root = tkinter.Tk() 96 97 root.title('お時間ですよ') 98 root.geometry('500x300+500+300') 99 100 message = tkinter.Message(root, text=WD, font=( 101 "MyricaM M", 20), fg='#ff0000', width=500) 102 message.pack(fill=tkinter.BOTH) 103 104 #ボタンを生成 105 #ここで生成される5つのボタンのうち、2つめと3つめのボタンだけサイズと配置を変えたい 106 last_group = None # 今グループ化しているグループ名 107 for info in word_list: 108 if info["group"] == None: 109 last_group = None 110 parent = root 111 pack_side = tkinter.TOP 112 elif info["group"] != last_group: 113 # 新しいFrameを作ってその中では左から詰めていくように設定する。 114 last_group = info["group"] 115 #print(f'grouped {info["group"]}') 116 parent = tkinter.Frame(root) 117 parent.pack(expand = True, fill = tkinter.BOTH) # fillしておかないとボタンが小さくなる 118 pack_side = tkinter.LEFT # ボタンの左詰め(左から右へ)を指定 119 120 button = ShortCutButton(master = parent, *info["buttonInfo"]) 121 button.config(bg='#F0F8FF') 122 button.pack(expand=1, fill=tkinter.BOTH, padx=10, pady=10, side = pack_side) 123 root.mainloop()

投稿2021/06/28 02:36

YakumoSaki

総合スコア2027

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

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

退会済みユーザー

退会済みユーザー

2021/06/28 08:30

具体的なコードを書いていただいてありがとうございます! 一人で考え込んでいて、なかなかできなかったので、大変助かりました。 グループ化して処理を分けるのですね、勉強になりました! ありがとうございました!
guest

0

やりかたはいくつかあります。

packでやる場合

packは一つの親widgetへの配置は縦方向のみか横方向のみしかできません。
そこで、2段目にframeを入れます。frameは枠だけのwidgetで、中に他のwidgetを配置することができるものです。

gridを使う

gridはpackと違って、もともとwidgetを2次元に配置することができる配置方法です。自由度が高い代りにいちいち場所を指定して配置しなければならないので、手間はかかります。

詳しい使いかたは、検索すれば出てくると思いますが、ちょっと探してよさそうだったところを参考に上げておきます。 ここではgridをframeを組み合わせて使っています。

投稿2021/06/28 01:38

TakaiY

総合スコア12819

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

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

退会済みユーザー

退会済みユーザー

2021/06/28 08:26

ありがとうございます! 参考サイト読ませていただきました! やりかたはいろいろあるのですね、勉強になりました ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問