pythonでGUIを作成しています。
機能の一部に、アカウント名とメールアドレスを任意の数記入する場所を作りたいと思っています。
記入する場所をスクロールできるようにしたいとのですがバーが動かなくて困っています。
該当のコードを記載しました。ここだけでもラベルが7のところまでしか表示できず、バーが動いていません。
# tkinter
from tkinter import *
import tkinter as tk
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self,master)
master.configure(bg="white")
self.pack() #描写
self.create_widgets(master) #フォームの作成
#フォームの作成
def create_widgets(self,master):
"""
スクロールバー Canvas
"""
# フォルダー表示 フレーム
frm = Frame(master)
frm.pack(padx=10 ,pady=15 , fill="both",expand=1)
#指摘を頂き変更
#canvas = Canvas(frm, width=400, height=150 ,bg="red",scrollregion=(0,0,400,400))
canvas = Canvas(frm, width=400, height=150 ,bg="red")
bar = Scrollbar(frm, orient=VERTICAL)
# 指摘を頂き修正
#bar.grid(row=0, column=1, sticky="nw")
bar.grid(row=0, column=1, sticky="ns")
bar.config(command=canvas.yview)
canvas.config(yscrollcommand=bar.set)
canvas.grid(row=0, column=0, sticky="news")
# Canvas Widget を配置
cframe=Frame(canvas, width=canvas.cget('width'))
canvas.create_window((0, 0), window=cframe, anchor="nw")
self.Widget_items = []
for i in range(10):
items = []
# アカウント名 ラベル
L_no = tk.Label(cframe)
L_no.configure(text=f"{i+1}", bg="white")
L_no.grid(row=i +1, column=0, sticky="nw")
items.append(L_no)
#指摘を頂き追加
canvas.update_idletasks()
canvas.config(scrollregion=canvas.bbox("all"))
if __name__ == "__main__":
root = Tk()
app = Application(master=root)
app.mainloop()
他のを調べて、
bar.config(command=canvas.yview)
canvas.config(yscrollcommand=bar.set)
ここが重要であると思って追加しているのですが、あとは何が原因でしょうか?
よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
- bar.grid(row=0, column=1, sticky="nw")
+ bar.grid(row=0, column=1, sticky="ns")
スクロールバーを縦方向に伸ばすには ns を指定します
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
Mac と tkinterの相性の問題だったようです。
https://www.python.org/download/mac/tcltk/
こちらより、最新のpythonを入れると問題なく動作しました
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2021/02/23 16:16
方向のことは完全に抜けておりました。
恐らくこれも原因のようですが、他にもあるようで動きませんでした🙇♂️
2021/02/23 16:34 編集
動かないとはどのような状況ですか?
- スクロールバーは動くが、左のキャンバス内の画面が追従しない
- スクロールバー自体が動かない
----
> bar.config(command=canvas.yview)
> canvas.config(yscrollcommand=bar.set)
> ここが重要であると思って追加しているのですが、あとは何が原因でしょうか?
他に重要な点は、scrollregion です。
スクロール領域が実際のキャンバスのサイズより狭い場合はスクロールしません。
対策: フォームにサイズを合わせる。create_widgetsメソッドの末尾で
# この時点ではサイズが決まってない為、updateで描画更新
canvas.update_idletasks()
canvas.config(scrollregion=canvas.bbox("all"))
2021/02/23 18:01
状況ですが、
- スクロールバー自体が動かない
となります。
次に、scrollregionですが
>canvas = Canvas(frm, width=400, height=150 ,bg="red",scrollregion=(0,0,400,400))
としておりますので、スクロール範囲の方が大きいと思っておりました。
末尾に
canvas.update_idletasks()
canvas.config(scrollregion=canvas.bbox("all"))
を追加しましたが、変化は見られ内容です。
2021/02/23 18:20
scrollregion の方が大きければ問題ありませんが、
region の範囲はマイナス座標を含む点にだけ注意。
create_window で指定した座標は、左上ではなく中心になります。
----
他に質問に掲載のコードと実行したコードに差異が無ければ、
実行環境の問題かもしれません。
エディタや開発環境の実行では、
編集中のコードと実行してるコードが違っていたという事もあるので、
ファイル名や場所を確認して、確認の為に端末から実行して見て下さい。
2021/02/23 18:22 編集
2021/02/23 18:40
開発環境がMacだったことが原因だったようです。
解決方法を探したいと思います。
ありがとうございました。
2021/02/23 18:57
Mac だと tk 自体が複数の実装があったりするので、
Apple提供ではなく、pythonr.org公式のものがお勧めされてるようです。
https://www.python.org/download/mac/tcltk/
----
後、正常に動いたとして必要になりそうな部分 (scrollregionについて)
開始時は、キャンバスの座標 (0, 0) が表示されるが
create_window で指定した座標は ウィジェットの中央になる為
(0, 0) を指定すると、スクロールバーが中央あたりになってしまいます。
例: サイズ 400x400 のウィジェットを 0, 0 に配置すると、
スクロールに指定する領域は -200,-200 ~ 200,200
# 最後に、スクロールバーの位置をリセット
canvas.yview_moveto(0)
2021/02/23 20:04
リンクから3.9.2を入れて実行すると動作しました!!!
本当に助かりました