рамка дисплея tkinter при нажатии - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь отобразить / включить функцию display_srv по щелчку команды строки меню и получить значения каждого флажка, выбранного с помощью кнопки Готово

import tkinter as tk
import glob
from tkinter import *

def frame_1():
    print("frame 1!")

Функция, которую я пытался отобразить в кадре:

def display_srv():
    frame_1 = root.LabelFrame(root, text="Liste Serveurs")
    frame_1.grid(row=0, sticky='ew', padx=20, pady=20, ipadx=5, ipady=5)
    path = '/home/lst/*.txt'
    files=glob.glob(path)
    count = 0
    for file in files:
        with open(file, 'r') as lst_file:
            for item in lst_file:
                lng = root.Checkbutton(frame_1, variable = item, text=item.rstrip()).grid(row=count//10, column=count%10)
                count += 1

Значение текстового файла:

item1
item2
item3
...
item100

Функция для получения значений:

def getvalue():
    print(list(lng.values()))

Основной скрипт:

root = Tk()
menu = Menu(root)
root.geometry('700x500')
root.title("My menu")
root.config(menu=menu)
testpsimenu = Menu(menu)
menu.add_cascade(label="Test Menu", menu=testpsimenu, font=("Arial", 12))
testpsimenu.add_command(label="Select 1", font=("Arial", 10), command=frame_1)
testpsimenu.add_separator()
testpsimenu.add_command(label="Select 2", font=("Arial", 10), command=display_srv)

psimenu = Menu(menu)
menu.add_cascade(label="PSI Real", menu=psimenu, font=("Arial", 12))
psimenu.add_command(label="Select 1", font=("Arial", 10), command=frame_1)
psimenu.add_separator()
psimenu.add_command(label="Select 2", font=("Arial", 10), command=frame_1)

exitmenu  = Menu(menu)
menu.add_cascade(label="Exit", menu=exitmenu, font=("Arial", 12))
exitmenu.add_command(label="Exit", command=root.quit, font=("Arial", 10))

Button(root, text='Done', font=("Arial", 12), command=getvalue).pack(side=RIGHT)

mainloop()

Это ошибка, когда я нажимаю на Select2 в меню testpsi:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib64/python3.6/tkinter/__init__.py", line 1702, in __call__
    return self.func(*args)
  File "./test_menu_7.py", line 13, in display_srv
    frame_1 = root.LabelFrame(root, text="Liste Serveurs")
  File "/usr/lib64/python3.6/tkinter/__init__.py", line 2098, in __getattr__
    return getattr(self.tk, attr)
AttributeError: '_tkinter.tkapp' object has no attribute 'LabelFrame'

Большое спасибо за вашу помощь ...

1 Ответ

0 голосов
/ 15 ноября 2018

Пока что я вижу 2 проблемы.

  1. Вам нужно использовать префикс tk. в своих виджетах, а не root.

Измените их:

root.LabelFrame
root.Checkbutton

К этим:

tk.LabelFrame
tk.Checkbutton
Вам необходимо определить lng как глобальную переменную, чтобы ее можно было использовать в вашей функции getvalue().

Добавьте эту строку global lng в начало display_srv() следующим образом:

def display_srv():
    global lng

Дайте мне знать, если у вас есть какие-либо вопросы.

...