Импорт Tkinter и rowspan / липкий вопрос

Я пишу программу для создания черновиков писем и пытаюсь настроить ее с помощью графического интерфейса tkinter. Я на Python 3.5 с tkinter 8.6.

Моя проблема в том, что я не могу заставить работать rowspan. Я хочу, чтобы первая строка занимала несколько строк, но когда я добавляю rowspan, строка не меняет размер. Если я добавлю «sticky = tK.N + tK.S», я получу ошибки, которые ничего не значат. Итак, я начал возиться с тем, как я импортировал tkinter, пробовал его как импорт из, импорт как tk, импорт *, но все, что я меняю, ломает что-то еще, и все еще не получает липкость север-юг, которую я ищу, поэтому что ряд растянется и заполнит пространство.

Я почти уверен, что это проблема, связанная с тем, как я импортирую tkinter, и любые советы будут очень признательны. Я также не могу заставить tkinter работать, если я использую 'import tkinter as tk ", потому что тогда я получаю ошибки, например, имя' StringVar 'не определено". Я попытался исправить это, переместив туда, где был объявлен мой корень, но это создало проблемы с графическим интерфейсом.

Помощь! Спасибо :)

import os
# pull in GUI stuff
import tkinter as tk #import Tk, Label, Button, W, E, N, S, StringVar, OptionMenu, Entry, Text, END, WORD
from PIL import Image, ImageTk

path = os.getcwd()


# init GUI
class GUI:
    def __init__(self, master):
        self.master = master
        master.title("Email Draft Builder")
        # set logo image
        f = os.getcwd() + "\\cgs_logo.gif"
        # lock in image for use outside this section
        im = Image.open(f)
        ph = ImageTk.PhotoImage(im)
        # vars to show dynamic text for displays 1 and 2
        self.box1_titleText = tk.StringVar()
        self.box2_titleText = tk.StringVar()

        self.box1_content = tk.StringVar()
        self.box2_content = tk.StringVar()

# main/container pane info
        self.label = tk.Label(master, text = "Email Draft Composer", image = ph, bg = "#ffffff")
        self.label.image = ph
        self.label.grid(columnspan = 3, row = 0, rowspan = 2, sticky=tk.N+
                        tk.S, column=1)

# ROW 1
        self.readLast_button = tk.Button(master, text = "Read Training File", command=self.dataOps)
        self.readLast_button.grid(row=3, column=0,sticky=tk.W)

# ROW 2
        self.file_button = tk.Button(master, text = "Unused", command=self.chooseSite)
        self.file_button.grid(row=4, column=0,sticky=tk.W)

# ROW 3
        self.pullSite_button = tk.Button(master, text = "Show Site Info:", command=self.pullSite)
        self.pullSite_button.grid(row=5, column=0,sticky=tk.W)

        self.getSite = tk.Entry(master)
        self.getSite.grid(row=5, column=1,sticky=tk.W)

# ROW 4
        self.sendEmail_button = tk.Button(master, text = "Build Email", command=self.sendEmail)
        self.sendEmail_button.grid(row=6, column=0,sticky=tk.W)

        recipients = ["[email protected]","[email protected]","[email protected];[email protected]","[email protected]"]
        self.receiver = tk.StringVar()
        self.receiver.set(recipients[0])
        self.menu1 = tk.OptionMenu(master, self.receiver, *recipients)
        self.menu1.grid(row=6, column=1,sticky=tk.W)

# ROW 5
        self.close_button = tk.Button(master, text = "Close", command=root.destroy)
        self.close_button.grid(row=7, column=0,sticky=tk.W)

# ROW 6
        self.box1_title = tk.Label(master, textvariable=self.box1_titleText, bg = "#fffff0", borderwidth=1, relief = "groove", width = 15)
        self.box1_title.grid(columnspan=1, row = 8, column=0, sticky=tk.W)
        self.box1_pane = tk.Label(master, textvariable=self.box1_content, bg = "#fffff0", borderwidth=1, relief = "groove", width = 55)
        self.box1_pane.grid(columnspan=1, row = 8, column=1,  sticky=tk.W)

# ROW 7
        self.box2_title = tk.Label(master, textvariable=self.box2_titleText, bg = "#ffff00", borderwidth=1, relief = "groove", width = 15)
        self.box2_title.grid(columnspan=1, row = 9, column=0, sticky='nw')
        self.box2_pane = tk.Label(master, textvariable=self.box2_content, bg = "#ffffff", borderwidth=1, relief = "groove", width = 55)
        self.box2_pane.grid(columnspan=1, row = 9, column=1, sticky='NW')
# ROW 8
        self.display1 = tk.Text(master, wrap=tk.WORD)
        self.display1.grid(columnspan=1, row = 10, column=1, sticky=tk.W)

    def dataOps(self):
        return(1)

    def chooseSite(self):
        return(1)        

    def pullSite(self):
        return(1)        

    def sendEmail(self):
        return(1)        


root = tk.Tk()
root.geometry('800x800')
root["bg"] = "#ffffff"
my_gui = GUI(root)
root.mainloop()

Если вы выполняете import tkinter as tk, вам нужно добавить префикс каждого объекта Tkinter с помощью tk.: tk.StringVar(), tk.Button() и т. д. Что касается вашего основного вопроса, rowspan= не имеет видимого эффекта, если в охватываемых строках нет других виджетов.

jasonharper 26.10.2018 19:42

Также, если вы используете sticky =, то синтаксис липкий = (tk.N, tk.S) Я считаю

Ben 26.10.2018 19:48

Вы опубликовали целую кучу кода, который, кажется, не имеет отношения к проблеме. Пожалуйста, попробуйте сжать код до минимальный воспроизводимый пример, разработанного специально для этого вопроса.

Bryan Oakley 26.10.2018 21:20

@Ben, используя это, я получаю «SyntaxError: позиционный аргумент следует за аргументом ключевого слова». Я читал в другом месте, что использование sticky to stretch to fill должно быть «+».

Korzak 26.10.2018 23:18

Отредактировал код.

Korzak 26.10.2018 23:29

@jasonharper, спасибо! Исправил импорт. Не знаю, почему на меня бомбит "import *", но я бы предпочел добавить т.к. ко всему, чем не заставить это работать. Как не влияет на это наличие виджета в строке? У меня есть метка в этой строке: self.label.

Korzak 26.10.2018 23:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
326
0

Другие вопросы по теме