Pysimplegui: sg.In()、sg.FilesBrowse()は、入力値として[参照]ボタンを読み取ります

作成日 2019年06月06日  ·  6コメント  ·  ソース: PySimpleGUI/PySimpleGUI

最新バージョンに更新した後、ファイル入力を取得するためのコードが機能しなくなったようです

event、(filename、)= sg.Window( 'Get filename example')。 Layout([[sg.Text( 'Filename')]、[sg.Input()、sg.FileBrowse()]、[sg.OK()、sg.Cancel()]])。Read()

ValueErrorが生成されます。値が多すぎて解凍できません(予想1)。
少し調べてみると、3.39.0ではFileBrowse()から発生した[参照]ボタンが入力として読み取られているようです。 3.29.0にダウングレードすると、問題が修正されました。 FileInput()でもテスト済み。

documentation

最も参考になるコメント

古いバージョンは値をリストとして返します。 新しいバージョンは、値を辞書として返します。 これが私が試したものです。

Textbox value = c:\files\a.txt

A. psg v3.28

e, v = window.Read()
print(v)
['c:/files/a.txt']

B. psg v3.37

e, v = window.Read()
print(v)
{0: 'c:/files/a.txt', 'Browse': 'c:/files/a.txt'}

次の場合、@ DKatarakisで示されるように、新しいバージョンでValueErrorが発生します。
e, (v,) = window.Read()

全てのコメント6件

すべてが正常に機能しています。 ALL-IN-ONE-LINEコードを書かないでください。

今。

It produces ValueError: too many values to unpack (expected 1).
これはPySimpleGUIの問題ではありません、@ DKatarakis。

通常の形式のコードは次のとおりです。

import PySimpleGUI as sg

layout = [
    [sg.Text('Filename')],
    [sg.Input(), sg.FileBrowse()],
    [sg.OK(), sg.Cancel()]
]


window = sg.Window('Simple App, Really simple.', layout)

while True:
    event, values = window.Read()
    if event is None or event == 'Exit': break

    print(event, values)

    if event == 'Button1':
        pass
    if event == 'Button2':
        pass
    if event == 'Button3':
        pass


window.Close()

古いバージョンは値をリストとして返します。 新しいバージョンは、値を辞書として返します。 これが私が試したものです。

Textbox value = c:\files\a.txt

A. psg v3.28

e, v = window.Read()
print(v)
['c:/files/a.txt']

B. psg v3.37

e, v = window.Read()
print(v)
{0: 'c:/files/a.txt', 'Browse': 'c:/files/a.txt'}

次の場合、@ DKatarakisで示されるように、新しいバージョンでValueErrorが発生します。
e, (v,) = window.Read()

問題は、ボタンも値を返し始めたことです。 これにより追加のエントリが作成され、ボタンであるため、戻り値が辞書に切り替えられました。

v [0]を参照すると、値(リストと同じ)が得られますが、辞書に保持されます。

ボタンが値を返している理由がわかりません。 Lemmeはリリースノートを読み、目的が何であるかを判断できるかどうかを確認します。 カレンダーウィジェットなどの専用ボタンが原因だと感じています。

古いバージョンは値をリストとして返します。 新しいバージョンは、値を辞書として返します。 これが私が試したものです。

Textbox value = c:\files\a.txt

A. psg v3.28

e, v = window.Read()
print(v)
['c:/files/a.txt']

B. psg v3.37

e, v = window.Read()
print(v)
{0: 'c:/files/a.txt', 'Browse': 'c:/files/a.txt'}

次の場合、@ DKatarakisで示されるように、新しいバージョンでValueErrorが発生します。
e, (v,) = window.Read()

はい、確かに。 正しく指定しなかったことをお詫び申し上げます。 ご意見ありがとうございます。

さらに詳しく調べてみると、4つのポートすべてでボタンの戻り値にしばらく前に変更がありました。 これはボタンの根本的な変更でした。 現在、戻り値があります。 これは、リストではないため、結果を「解凍」しようとするアプリケーションにとって実際の問題を引き起こします。

ドキュメントで直接解凍することはお勧めしません。 []を使用して、値がリストであるかのように戻り値にアクセスできます。直接解凍することはできません。

これにつきましては申し訳ございません!

_アップグレード時に既存のコードを壊すことは私にとって大罪なので、本当に申し訳ありません。_コードを変更して、1ではなく2つのステップで戻り値にアクセスする必要があります。

あなたの1行のプログラムは2になりました

event, values = sg.Window('Get filename example'). Layout([[sg.Text('Filename')], [sg.Input(), sg.FileBrowse()], [sg.OK(), sg.Cancel()] ]).Read()
filename = values[0]
このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

scmanjarrez picture scmanjarrez  ·  5コメント

xuguojun168 picture xuguojun168  ·  3コメント

mozesa picture mozesa  ·  4コメント

ECOM-Klaus picture ECOM-Klaus  ·  4コメント

MikeTheWatchGuy picture MikeTheWatchGuy  ·  3コメント