Создать класс фреймов в Tkinter Gui

Предполагая, что ваши данные введены в data.frame, называемом dat, скажем, два фактора приведены в этом примере:

> dat <- data.frame(f1=sample(LETTERS[1:3],20,T),f2=sample(LETTERS[4:5],20,T),id=1:20)
> dat
   f1 f2 id
1   C  D  1
2   B  E  2
3   B  E  3
4   A  D  4
5   C  E  5
6   C  E  6
7   C  D  7
8   B  E  8
9   C  D  9
10  A  D 10
11  B  E 11
12  C  E 12
13  B  D 13
14  B  E 14
15  A  D 15
16  C  E 16
17  C  D 17
18  C  D 18
19  B  D 19
20  C  D 20
> dat$f1
 [1] C B B A C C C B C A B C B B A C C C B C
Levels: A B C
> dat$f2
 [1] D E E D E E D E D D E E D E D E D D D D
Levels: D E

Вы можете использовать outer, чтобы получить матрицу как вы показали, для каждого фактора:

> F1 <- with(dat, outer(f1, levels(f1), `==`)*1)
> colnames(F1) <- paste("f1",sep="=",levels(dat$f1))
> F1
      f1=A f1=B f1=C
 [1,]    0    0    1
 [2,]    0    1    0
 [3,]    0    1    0
 [4,]    1    0    0
 [5,]    0    0    1
 [6,]    0    0    1
 [7,]    0    0    1
 [8,]    0    1    0
 [9,]    0    0    1
[10,]    1    0    0
[11,]    0    1    0
[12,]    0    0    1
[13,]    0    1    0
[14,]    0    1    0
[15,]    1    0    0
[16,]    0    0    1
[17,]    0    0    1
[18,]    0    0    1
[19,]    0    1    0
[20,]    0    0    1

Теперь сделайте то же самое для второго фактора:

> F2 <- with(dat, outer(f2, levels(f2), `==`)*1)
> colnames(F2) <- paste("f2",sep="=",levels(dat$f2))

И cbind их, чтобы получить окончательный результат:

> cbind(F1,F2)
1
задан Bruno 20 August 2010 в 14:03
поделиться

2 ответа

Я нашел ответ:

class WindowProgram(Tkinter.Frame)
    """ This class creates a frame for my program window """
    def __init__(self, parent):
        Tkinter.Frame.__init__(self, parent)

class App(Tkinter.Tk):
    """ application constructor """
    def __init__(self):
        Tkinter.Tk.__init__(self)
        self.window_program = Window_Program(self)
2
ответ дан 2 September 2019 в 21:58
поделиться

Зачем вам нужен класс, создающий несколько фреймов? Создание одного класса, который создает несколько фреймов, - не очень хорошее решение. Для этого не нужен ни один класс.

Либо создайте отдельные классы для каждого кадра, либо просто создайте в своем приложении методы для создания каждого кадра. Я предпочитаю последнее, но если вам нужен фрейм, который можно использовать в нескольких контекстах, иногда имеет смысл создать класс.

Когда я создаю графический интерфейс, я структурирую свой код следующим образом:

class App(Tkinter.Tk):
    def __init__(self):
        Tkinter.Tk__init__(self)
        self.menubar = self.makeMenubar(...)
        self.frame1 = self.makeFrame1(...)
        self.frame2 = self.makeFrame2(...)

        self.configure(menu=self.menubar)
        self.frame1.grid(...)
        self.frame2.grid(...)

Таким образом, каждый основной раздел получает свой собственный метод, чтобы скрыть детали создания виджета. Конечно, вы можете сделать каждый фрейм индивидуальным объектом, но обычно в этом нет необходимости.

0
ответ дан 2 September 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: